如何抑制函数返回

时间:2013-06-04 15:20:18

标签: julia

假设我有一个具有多个返回值的函数(如下所示)。但是,此输出不提供信息,因为用户不知道每个值代表什么,除非他们查找函数定义。因此,我想使用println()以适当的名称将结果打印到屏幕上,同时抑制在屏幕上打印的实际返回值。在R中,函数invisible()就是这样做的,但是你如何在Julia中做同样的事情呢?

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 个答案:

答案 0 :(得分:3)

除了Harlan和Stefan所说的,让我分享一下ODBC.jl包(source here)中的一个例子。 与其他语言相比,Julia最喜欢的功能之一是创建自定义类型(并且没有性能问题!)。这是一个自定义类型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

同样,没什么特别之处,但说明了定义自定义类型并随之生成自定义输出是多么容易。

干杯。

答案 1 :(得分:2)

您可以做的一件事是为此函数的返回值定义一个新类型,将其称为TrimCIResult或其他东西。然后,您可以定义适当的方法以在REPL中显示该对象。或者,您可以使用可用于存储结果并显示任何统计测试的类型层次结构来推广该解决方案。

答案 2 :(得分:0)

nothing是返回不打印值的方式:repl专门检查值nothing,如果表达式返回的值,则不打印任何内容。你要做的是返回一堆值而不打印它们,这让我觉得很奇怪。如果一个函数返回一些东西,我想知道它 - 让用户说谎是一个坏主意。 Harlan的建议可行但是:使用您不希望作为字段向用户公开的值定义此值的类型并自定义其打印,以便不打印您不想显示的字段。