【问题标题】:Add string of (variable number of) arguments to a function within a function向函数内的函数添加(可变数量)参数字符串
【发布时间】:2017-01-05 11:13:33
【问题描述】:

假设我有一个函数可以根据输入变量的长度创建 x 个对象。然后,我希望将这些 x 个对象用作我提供给我的函数的函数中的参数。假设我的参数数量是可变的(基于提供的参数名称的数量),我该怎么做?

我可以通过一串参数名称来做到这一点吗?

一个无效的例子来说明我在问什么:

(在这种情况下,使用在函数外部创建的参数来简化示例):

foo <- 1:5
na.rm <- T
func <- mean

f1 <- function(func,arg.names) { 
  func(get(arg.names)) }
f1(func,arg.names = c('foo','na.rm')

如何以get 的所有参数从我的列表中的方式执行此操作?

【问题讨论】:

    标签: r function arguments


    【解决方案1】:

    我们可以试试mget

    f1 <- function(func,arg.names) { 
          lst <- mget(arg.names, envir = parent.frame())
            func(lst[[1]], na.rm = lst[[2]])
     }
    
    f1(func, arg.names = c('foo', 'na.rm'))
    #[1] 3
    

    或者另一个选项是do.call(如@thelatemail 的帖子中所述),但将第一个list 元素的name 更改为“x”,因为x 是@987654327 中的“数据”参数@函数

    ## 默认 S3 方法:

    平均值(x,trim = 0,na.rm = FALSE,...)

     f1 <- function(func,arg.names) { 
            lst <- mget(arg.names, envir = parent.frame())
            names(lst)[1] <- 'x'
             do.call(func, lst)
         }
    
    f1(func, arg.names = c('foo', 'na.rm'))
    #[1] 3
    

    【讨论】:

    • 完美!这正是我正在寻找的!谢谢@akrun。但现在真正的问题......这是完成我想要做的事情的正确(最佳)方式吗?还是我的方法可能是“草率”或不恰当的方法?
    • @theforestecologist 谢谢,关于这个问题,这取决于你为什么要走这条路。也许您可以发布一个新问题,提供有关最终目标的更多详细信息。
    【解决方案2】:

    ?do.call 的魔力在等着你:

    do.call(func, list(foo, na.rm=na.rm))
    #[1] 3
    

    这基本上只是创建和运行:

    func(foo, na.rm=na.rm)
    

    ...func 的参数作为(可能命名的)列表传入。

    【讨论】:

    • 如果我必须将参数作为字符串提供,而不是对象名称本身呢? (例如,'foo' & 'na.rm' vs. foo & na.rm)
    • @theforestecologist - 我认为 akrun 已经为您介绍了以下内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-02-16
    • 2014-05-25
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多