gpt4 book ai didi

r - do.call 指定函数内部的环境

转载 作者:行者123 更新时间:2023-12-04 11:39:30 25 4
gpt4 key购买 nike

我在包中使用以下构造,

## two functions in the global environment
funa <- function(x) x^2
funb <- function(x) x^3
## called within a function, fine
fun_wrap <- function(){
lapply(c('funa', 'funb'), do.call, list(x=3))
}

fun_wrap()
[[1]]
[1] 9

[[2]]
[1] 27

但我只是被一个事实咬住了,如果函数在不同的(本地)框架中,它就不会工作,
## same construct, but the functions are local
fun_wrap1 <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
lapply(c('funa1', 'funb1'), do.call, list(x=3))
}
## now it fails
fun_wrap1()
##Error in FUN(c("funa1", "funb1")[[1L]], ...) :
## could not find function "funa1"

我试过通过 envir=parent.frame(2)do.call() (不起作用);坦白说 ?parent.frame的帮助页面超出了我的头。任何关于更强大地使用 do.call 的提示?

请注意,函数列表是从另一段代码传递过来的字符向量;我不想直接传递函数。

编辑:再转一圈...我以为我已经用我的玩具示例说明了正确的问题,但我使用的实际代码略有不同,从某种意义上说,我正在调用 fun_wrap1在一个单独的函数中。在这种情况下,所提出的解决方案失败了。
fun_wrap1 <- function(funs){
lapply(funs, do.call, args=list(x=3), envir=environment())
}

foo <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
fun_wrap1(c('funa1', 'funb1'))
}

foo()
##Error in FUN(c("funa1", "funb1")[[1L]], ...) :
## could not find function "funa1"

(同样适用于 match.fun 方法)

我可以通过将可选环境传递给 fun_wrap1 来使其工作,
fun_wrap1 <- function(funs, e=parent.frame()){
lapply(funs, do.call, args=list(x=3), envir=e)
}

foo <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
fun_wrap1(c('funa1', 'funb1'))
}

foo()

希望就是这样。

最佳答案

这似乎有效,但我不确定它是否有我没有考虑的其他影响:

fun_wrap1 <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
lapply(c('funa1', 'funb1'), do.call, args=list(x=3), envir=environment())
}

fun_wrap1()
#[[1]]
#[1] 9
#
#[[2]]
#[1] 27

所以这本质上等同于拥有 lapply声明如下:
lapply(
c('funa1', 'funb1'),
function(f) do.call(f, args=list(x=3), envir=environment() )
)

关于r - do.call 指定函数内部的环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26028488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com