我在R中使用,包含函数调用的“elipsis”或“dots”
main_function <- function(...)
如果我想评估一次,我会
main_function <- function(...) {
res = list(...)}
工作正常
fun_A <- function(arg_A){
print(paste("I am A", paste0(round(runif(arg_A, 0,1), 2),collapse = ", ")))
}
fun_B <- function(arg_B){
print(paste("I am B", paste0(round(runif(arg_B, 1,2), 2),collapse = ", ")))
}
此处结果评估一次并复制3次:
main_fun_wrong <- function(..., times) {
res = list(...)
replicate(times, eval(res))
}
main_fun_wrong(fun_A(1), fun_B(2), times = 3)
这里有效:
main_fun <- function(..., times) {
calls = match.call(expand.dots = FALSE)$`...`
replicate(times, lapply(1:length(calls), function(num) eval(calls[[num]])), simplify = F)
}
main_fun(fun_A(1),fun_B(2), times = 3)
但是现在如果arg_A是一个对象而不是一个值,它将无法在环境中找到arg_A和arg_B。
main_fun_problem <- function(arg_A, arg_B) {
main_fun(fun_A(arg_A),fun_B(arg_B), times = 3)
}
main_fun_problem(1,2)
我收到了一个错误:
fun_A(arg_A)出错:找不到对象'arg_A'
我不知道R在第一个例子中第一次找到列表(...)时做了什么,但我只是想重复多次。
答案 0 :(得分:0)
这是我的解决方案,任何替代方案都将享受。
事情是在我们调用函数时用它的值替换变量。
l
NB:list(“arg_A”= arg_A,“arg_B”= arg_B)`让我的心脏流血(实际上是整体解决方案)