【问题标题】:Is it possible to supply unused arguments to do.call?是否可以为 do.call 提供未使用的参数?
【发布时间】:2021-08-06 16:05:41
【问题描述】:

假设我有以下功能:

a <- function(p, q){p * q}

我想在动态do.call()statement 中使用该函数:

do.call("a", list(p = 3, q = 3))

效果很好。

但是当使用动态函数名进行 do.call-call 时,list() 中所需的参数会发生变化。

do.call("a", list(p = 3, q = 3, f = 3))

这会引发错误,因为函数 a 不需要 f。然而,f 是动态 do.call 设置中使用的后续函数的参数。

是否可以允许 do.call 调用的特定函数中不需要但在函数更改时需要的参数?

例子:


a <- function(p, q){p * q}
b <- function(m, n){paste(m, n)}

funs <- c("a", "b")

for(i in funs){
do.call(i, list(p = 3, q = 3, m = "Yes", n = "No")
} 

【问题讨论】:

标签: r


【解决方案1】:

您可以使用formalArgs 对列表进行子集化。

a <- function(p, q){p * q}
b <- function(m, n){paste(m, n)}

funs <- c("a", "b")
for(i in funs){
  do.call(i, list(p = 3, q = 3, m = "Yes", n = "No")[formalArgs(i)])
}

【讨论】:

    【解决方案2】:

    您可以在函数中使用... 参数。如果您不想依赖其他软件包或在 do.call 之外使用您的功能,它会很有用。

    例子:

    a <- function(p, q, ...){p * q}
    

    输出:

    > a(p = 4, q = 2, f = 1)
    [1] 8
    

    这是你的例子:

    a <- function(p, q, ...){p * q}
    b <- function(m, n, ...){paste(m, n)}
    
    funs <- c("a", "b")
    
    for(i in funs){
      print(do.call(i, list(p = 3, q = 3, m = "Yes", n = "No"))) # had to edit it to make a "printable" output for SO
    } 
    

    输出:

    > for(i in funs){
    +   print(do.call(i, list(p = 3, q = 3, m = "Yes", n = "No")))
    + } 
    [1] 9
    [1] "Yes No"
    

    【讨论】:

      【解决方案3】:

      不确定它是否适合您,但您不一定需要命名参数。您可以按位置传递参数

      funs <- list("a", "b")
      args <- list(list(3, 3), list('Yes', 'No'))
      
      Map(function(x, y) do.call(x, y), funs, args)
      
      #[[1]]
      #[1] 9
      
      #[[2]]
      #[1] "Yes No"
      

      【讨论】:

      • 对...,不幸的是,我认为这对我的情况不起作用,因为从那时起,我将不得不按位置提供一系列参数...我想简单地提供所有可能的参数和只使用我正在迭代的函数所需的那些。
      【解决方案4】:

      我找到了解决办法。

      存在base::do.call() 的修改版本。 R.utils::doCall() 的参数 .ignoreUnusedArgs 默认设置为 TRUE。然后可以为R.utils::doCall(.fun, args = list(...)) 中的某个函数提供比所需更多的输入,而不会引发未使用参数的错误。

      这解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 2022-01-08
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多