【问题标题】:Catch function name passed in as argument to a function, for different handling?捕获作为参数传递给函数的函数名称,以进行不同的处理?
【发布时间】:2018-05-07 22:31:01
【问题描述】:

假设我有一个函数:fun1 <- function(x, fun2) { # do something } 其中x 是一个向量,fun2 是一个函数的名称。

如何在函数中测试fun2 名称?比如fun2是“mean”,那么我想返回一个vector,如果fun2是“summary”,我想返回一个list。

【问题讨论】:

    标签: r function parameter-passing


    【解决方案1】:

    使用match.arg 来做类似的事情怎么样?

    custom_function <- function(x) return(cat(sprintf("%05.4f\n", x)));
    
    fun1 <- function(x, fun2 = c("mean", "summary", "custom_function")) {
        fun2 <- match.arg(fun2);
        if (fun2 == "mean") return(mean(x));
        if (fun2 == "summary") return(summary(x));
        if (fun2 == "custom_function") return(custom_function(x));
    }
    
    fun1(c(1,2,3), "mean");
    [1] 2
    fun1(c(1,2,3), "summary");
    #Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    # 1.0     1.5     2.0     2.0     2.5     3.0
    fun1(c(1,2,3), "custom");
    #1.0000
    # 2.0000
    # 3.0000
    

    arg.match 有一个很好的属性,它也匹配部分参数。例如fun1(c(1,2,3), "sum") 也会返回summary

    【讨论】:

    • 如果我们将用户定义的函数传递给 fun2 会怎样
    • 这根本不需要match.arg,只是用来做验证。
    • @HongOoi 同意。仍然允许通过匹配参数获得更大的灵活性。但实际上你可以省略fun2 &lt;- match.arg(fun2)这一行。
    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多