r - 将所有参数传递给另一个函数
问题描述
我希望能够将函数中的当前参数传递给另一个函数,而无需单独列出每个参数。这是一个稍微复杂一点的函数,它将有大约 15 个参数,稍后可能会添加更多参数(它基于数据 API,稍后可能会添加更复杂的数据):
f_nested <- function(a, b, ...) {
c <- a + b
return(c)
}
f_main <- function(a, b) {
d <- do.call(f_nested, as.list(match.call(expand.dots = FALSE)[-1]))
c <- 2 / d
return(c)
}
f_main(2, 3)
#> [1] 0.4
sapply(2:4, function(x) f_main(x, 4))
#> Error in (function (a, b, ...) : object 'x' not found
由reprex 包(v0.3.0)于 2019 年 6 月 28 日创建
第一次调用 f_main(2, 3) 会产生预期的结果。但是,当迭代带有sapply
错误的值向量时,会出现找不到对象的错误。我怀疑我的match.call()
使用不正确,我希望能够迭代我的函数。
解决方案
我将借用lm
's used of match.call
,用下一个函数替换第一个元素。我认为一个关键是用 调用eval
,parent.frame()
这样x
就可以正确解决。
# no change
f_nested <- function(a, b, ...) {
c <- a + b
return(c)
}
# changed, using `eval` instead of `do.call`, reassigning the function name
f_main <- function(a, b) {
thiscall <- match.call(expand.dots = TRUE)
thiscall[[1]] <- as.name("f_nested")
d <- eval(thiscall, envir = parent.frame())
c <- 2 / d
return(c)
}
sapply(2:4, function(x) f_main(x, 4))
# [1] 0.3333333 0.2857143 0.2500000
正如@MrFlick 建议的那样,这可以通过以下方式稍微缩短:
f_main <- function(a, b) {
thiscall <- match.call(expand.dots = TRUE)
thiscall[[1]] <- as.name("f_nested")
d <- eval.parent(thiscall)
c <- 2 / d
return(c)
}
推荐阅读
- r - LMM 的似然比检验给出的 P 值为 1?
- drupal-8 - Drupal 8:如何在自定义模块中更改块中的内容
- javascript - Javascript转
我正在尝试将我的 <c: out 值转换为 Javascript 日期,但是当我尝试它时,我不断收到无效的日期。这是我试图变成 Javascript dateTime 的字符串。
24-02-2021 17:34:27
我通过执行以下操作获得此值:
va
- java - 背景图片itextpdf 5.5
- vue.js - bootstrap-vue 如何在 b-dropdown 中包含 b-form-datepicker
- windows - How to Change the My Computer Desktop Icon Using Powershell?
- python - 多进程不停止请求输入,返回错误
- javascript - react-select: stopPropagation when clicking on an option
- c# - Accessing Sharepoint online with MFA through C#
- apache-flink - Flink EMR Deployment can't pick up Yarn context and executes only as a local application