2013-06-04 6 views
1

Предположим, у меня есть функция с несколькими возвращаемыми значениями (показано ниже). Однако этот вывод не является информативным, поскольку пользователи не знают, что означает каждое значение, если они не ищут определения функции. Поэтому я хотел бы использовать println(), чтобы распечатать результаты с соответствующими именами на экране, подавляя фактические возвращаемые значения от печати на экране. В R функция invisible() делает это, но как вы делаете то же самое в Джулии?Как подавить возврат функции

function trimci(x::Array; tr=0.2, alpha=0.05, nullvalue=0) 
    se=sqrt(winvar(x,tr=tr))./((1-2.*tr)*sqrt(length(x))) 
    ci=cell(2) 
    df=length(x)-2.*floor(tr.*length(x))-1 
    ci=[tmean(x, tr=tr)-qt(1-alpha./2, df).*se, tmean(x, tr=tr)+qt(1-alpha./2, df).*se] 
    test=(tmean(x,tr=tr)-nullvalue)./se 
    sig=2.*(1-pt(abs(test),df)) 
    return ci, tmean(x, tr=tr), test, se, sig 
end 

ответ

3

В дополнение к тому, что сказал Харлан и Стефан, позвольте мне рассказать пример из пакета ODBC.jl (source here). Одна из моих любимых особенностей Джулии над другими языками - это то, насколько мертвым просто создавать пользовательские типы (и без проблем с производительностью!). Вот специальный тип, Metadata, который просто содержит несколько полей данных, которые описывают выполненный запрос. Для этого необязательно нужен собственный тип, но он делает более удобным передавать все эти данные между функциями, а также позволяет настраивать форматирование его вывода, перегружая функцию Base.show().

type Metadata 
    querystring::String 
    cols::Int 
    rows::Int 
    colnames::Array{ASCIIString} 
    coltypes::Array{(String,Int16)} 
    colsizes::Array{Int} 
    coldigits::Array{Int16} 
    colnulls::Array{Int16} 
end 
function show(io::IO,meta::Metadata) 
    if meta == null_meta 
     print(io,"No metadata") 
    else 
     println(io,"Resultset metadata for executed query") 
     println(io,"------------------------------------") 
     println(io,"Columns: $(meta.cols)") 
     println(io,"Rows: $(meta.rows)") 
     println(io,"Column Names: $(meta.colnames)") 
     println(io,"Column Types: $(meta.coltypes)") 
     println(io,"Column Sizes: $(meta.colsizes)") 
     println(io,"Column Digits: $(meta.coldigits)") 
     println(io,"Column Nullable: $(meta.colnulls)") 
     print(io,"Query: $(meta.querystring)") 
    end 
end 

Опять же, ничего особенного, но показывает, как легко на самом деле определить пользовательский тип и производить собственный выход вместе с ним.

Cheers.

2

Одна вещь, которую вы могли бы сделать, чтобы определить новый тип для возвращаемого значения для этой функции, вызовите его TrimCIResult или что-то. Затем вы можете определить соответствующие методы для отображения этого объекта в REPL. Или вы можете обобщить это решение с иерархией типов, которая может использоваться для хранения результатов и отображения статистического теста.

0

Значение nothing - это то, как вы возвращаете значение, которое не будет печататься: repl специально проверяет значение nothing и ничего не печатает, если это значение, возвращаемое выражением. То, что вы хотите сделать, это вернуть кучу значений, а не печатать их, что кажется мне довольно странным. Если функция возвращает некоторые вещи, я хочу знать об этом - наличие ложных ответов пользователям кажется плохой идеей. Предполагалось, что Харлан предложит: определите тип для этого значения со значениями, которые вы не хотите показывать пользователю как поля, и настройте его печать, чтобы поля, которые вы не хотите показывать людям, не печатаются.

+0

Я не думаю, что я был ясно в своем оригинальном посте. Я имел в виду более удобное форматирование и добавление дополнительной информации к выходу. Например, вышеприведенная функция выводит средний доверительный интервал на основе обрезки, обрезанное среднее значение и т. Д. Я хочу, чтобы на выходе отображалось нечто вроде «CI: 123, 234, обрезанное среднее: 100; test_statistic: 4.323; p = 0.000123». Мне в основном нужно, чтобы результат был более информативным. Если бы я сначала напечатал значения, а затем вернул все значения, я бы дважды напечатал значения, напечатанные на экране. – Alex

Смежные вопросы