r – 在子函数内的gsubfn里面的eval:找不到对象

给出这两个功能

subfun <- function(txt) 
  gsubfn::gsubfn("§([^§]+)§", ~eval(parse(text=x)), txt)

topfun <- function(id = 1L) 
  subfun("Hello §id§ world!")

以下(1.)应该产生“Hello 1 world!”但是会抛出错误:

topfun() 
# Error in eval(expr, envir, enclos) : object 'id' not found

这两个(2.)& (3.)按预期工作:

id <- 2L
topfun()
# [1] "Hello 2 world!"

topfun2 <- function(id = 1L) 
  gsubfn::gsubfn("§([^§]+)§", ~eval(parse(text=x)), "Hello §id§ world!")
topfun2() 
# [1] "Hello 1 world!"

我怎样才能使(1.)工作?

我使用eval和gsubfn的envir参数尝试了几个environment()和parent.frame()变体,包括通过省略号参数将topfun的环境传递给subfun.一切都没有成功. (并不是说我对引擎盖下发生的事情有了更多的了解.但是我希望R能够在一个接一个的父环境中寻找id …)

我使用的是R版本3.3.0和gsubfn软件包版本0.6.6.

提前致谢!

最佳答案 我不是这方面的专家,但问题似乎是在gsubfun中使用公式作为替代品.如果它在公式中,至少我无法将环境传递给eval.

subfun_2 <- function(txt){
  ev <- parent.frame() # the environment in which subfun_2 was called
  gsubfn::gsubfn("§([^§]+)§", ~eval(parse(text=x), envir = ev), txt)
}
topfun_2 <- function(id = 1L) subfun_2("Hello §id§ world!")
topfun_2()
# Error in eval(parse(text = x), envir = ev) : 
#  argument "ev" is missing, with no default

如果您使用函数而不是按预期工作:

subfun_3 <- function(txt){
   ev <- parent.frame() 
   gsubfn::gsubfn("§([^§]+)§", function(x)eval(parse(text=x), envir = ev), txt)
}
topfun_3 <- function(id = 1L) subfun_3("Hello §id§ world!")
topfun_3()
# Hello 1 world!
点赞