3

假设我有一个具有多个返回值的函数(如下所示)。但是,此输出没有提供信息,因为用户不知道每个值代表什么,除非他们查找函数定义。所以我想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
4

3 回答 3

5

除了 Harlan 和 Stefan 所说的,让我分享一个来自 ODBC.jl 包的示例(来源此处)。相对于其他语言,我最喜欢 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

同样,没有什么花哨的,但说明了定义自定义类型并随之产生自定义输出是多么容易。

干杯。

于 2013-06-05T14:35:25.227 回答
2

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

于 2013-06-04T16:05:05.510 回答
1

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

于 2013-06-04T16:27:56.457 回答