【问题标题】:Creating a function in R with variable number of *named* arguments在 R 中创建具有可变数量的 *named* 参数的函数
【发布时间】:2020-04-13 04:32:57
【问题描述】:

在 R 中,可以使用 ... 创建具有可变数量参数的函数,如图所示 here

但是,我想要一个具有可变数量的命名(正式)参数的函数。 作为一个最小的例子,类似于

f_nargs <- function(n) {

  # process argument n
  # ...
  f(x1, ..., xn) # What should this be ?
}

我怎样才能做到这一点?


总体目标是在包中使用函数(al)。该函数(al)需要一个具有 3 个形式参数的函数作为输入。虽然我可以专门为 n=3 编写函数,但我很好奇这是否可以为一般 n 完成。


编辑:这是我的想法:

我当前的函数是f(x),其中x是一个长度为3的向量。

我想在将其传递给包中​​的函数之前将其转换为f(x1, x2, x3)。这个函数检查length(formals(f))==3

目前,我将f 传递给

split_args3 <- function(f) {
  force(f)
  function(x1, x2, x3, ...) {
    f(c(x1, x2, x3), ...)
  }
}

这有效,但仅适用于特定的 n。然后我尝试使用

split_args <- function(f, d) {
  force(f)
  force(d)
  function(...) {
    dots <- list(...)
    arg1 <- do.call(c, dots[1:d])
    do.call(f, append(list(arg1), dots[-(1:d)]) )
  }
}

但它未能通过功能检查。

【问题讨论】:

  • 不确定我是否明白这个问题。 ... 将接受任意参数,命名或未命名;您可以收集(例如使用dots &lt;- list(...))以检查它们是否都已命名。

标签: r function


【解决方案1】:

随意更改参数列表,然后将其传递给do.call

split_args <- function(f, d) {
    force(f)
    force(d)
    function(...) {
        dots <- list(...)
        dots <- c(list(unlist(dots[seq(d)])), dots[-seq(d)])
        do.call(f, dots)
    }
}

mean3 <- split_args(mean, 3)
mean3(2, NA, 3, na.rm = TRUE)
#> [1] 2.5

【讨论】:

  • 谢谢。您能否详细说明如何更改参数列表?例如。 names &lt;- c(x1,x2,x3)?另外,length(formals(mean3)) 返回 1,虽然我希望它是 3。
  • length(formals(mean3)) 是 1,因为它只有一个正式的 ...。否则,当split_args 运行(并在语言对象上操作)时,需要为所有这些参数命名。重新排列dots 与重新排列任何其他列表相同;您可以按照自己的喜好进行操作,但关键是将其从 list(1, 2, 3, 4) 更改为 list(c(1, 2, 3), 4)。如果您想玩玩,请在其中打一个browser() 调用,然后在调试器中玩弄真实数据。
猜你喜欢
  • 2018-07-19
  • 2012-11-23
  • 1970-01-01
  • 2023-03-25
  • 2014-11-13
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多