首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >do.call指定函数内部的环境

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

Stack Overflow用户
提问于 2014-09-25 00:12:11
回答 3查看 1.2K关注 0票数 6

我在一个包中使用以下构造,

代码语言:javascript
复制
## 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

但我只是被这样的事实咬了一口:如果函数是在不同的(本地)框架内,它就不能工作,

代码语言:javascript
复制
## 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。在这方面,拟议的解决办法失败了。

代码语言:javascript
复制
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传递一个可选环境来使其工作,

代码语言:javascript
复制
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()

希望就是这样。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-25 00:43:34

这似乎是可行的,但我不确定它是否有其他的含义,我没有考虑:

代码语言:javascript
复制
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语句设置为:

代码语言:javascript
复制
lapply(
       c('funa1', 'funb1'), 
       function(f) do.call(f, args=list(x=3), envir=environment() )
      ) 
票数 5
EN

Stack Overflow用户

发布于 2014-09-25 00:32:14

显然,如果我们在fun_wrap2中评估这些函数,它就能工作。问题中的方法的问题是字符串被转换成一个处理函数中的函数,这改变了查找路径。

代码语言:javascript
复制
fun_wrap2 <- function(){

  funa1 <- function(x) x^2
  funb1 <- function(x) x^3

  nms <- c("funa1", "funb1")
  funs <- lapply(nms, match.fun)
  lapply(funs, do.call, list(x=3))

}

fun_wrap2()
票数 2
EN

Stack Overflow用户

发布于 2014-09-25 00:36:11

一个稍微简单一些的@g-格罗特迪克的答案。我们没有使用函数名,而是将函数本身放入输入给lapply的列表中。

代码语言:javascript
复制
fun_wrap1 <- function(){
  funa1 <- function(x) x^2
  funb1 <- function(x) x^3
  lapply(list(funa1, funb1), do.call, list(x=3))
}

fun_wrap1()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26028488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档