使用运行时生成的省略参数(点-点-点/三个点)调用R函数

4

我想调用一个使用 ...(省略号)参数以支持不确定数量的参数的 R 函数:

f <- function(x, ...) {
  dot.args <- list(...)
  paste(names(dot.args), dot.args, sep = "=", collapse = ", ")
}

我可以调用这个函数并传递在设计时预定义的实际参数,例如:
> f(1, a = 1, b = 2)
[1] "a=1, b=2"

我应如何传递在运行时才知道的实际参数(例如,来自用户输入)给...
# let's assume the user input was "a = 1" and "b = 2"
# ------
# If the user input was converted into a vector:
> f(1, c(a = 1, b = 2))
[1] "=c(1, 2)"                # wrong result!
# If the user input was converted into a list:
> f(1, list(a = 1, b = 2))
[1] "=list(a = 1, b = 2)"     # wrong result!

动态生成的f调用的期望输出应为:
[1] "a=1, b=2"

我在如何使用...的现有问题中找到了一些内容,但它们没有回答我的问题:

如何在编写自己的函数时使用R的省略号功能?

R函数中点/句号的用法

将...参数传递给另一个函数

我可以删除...(点-点-点)中的一个元素并将其传递吗?


dot.args <- unlist(list(...)) 或者 dot.args <- c(...) 看起来可以实现你想要的功能。 - user2957945
@user2957945 我不确定我是否理解你的意思。如何使用 dot.args <- unlist(list(...)) 调用 f() - R Yoda
1
抱歉,我误解了。我建议您使用上述语法重写函数。也许您想要 do.call(f, list(a = 1, b = 2)) - 但可能需要检查输入是否为列表或向量。 - user2957945
@user2957945,这很简单!请将其发布为答案! - R Yoda
1个回答

5
你可以使用 do.call 传递函数参数。首先使用 as.list 强制转换为列表。
例如:
input <- c(a = 1, b = 2)
do.call(f,  as.list(input))

input <- list(a = 1, b = 2)
do.call(f,  as.list(input))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接