eval inside gsubfn inside sub function: 找不到对象

eval inside gsubfn inside sub function: object not found

给出两个函数

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.) 工作?

我用 evalgsubfnenvir 参数尝试了几个 environment()parent.frame() 变体,包括传递 topfun 的通过省略号参数将环境设置为 subfun。一切都没有成功。 (并不是说我对幕后发生的事情有更多的了解。但我本以为 R 会在一个又一个父环境中寻找 id...)

我正在使用 R version 3.3.0gsubfn 包版本 0.6.6

提前致谢!

我不是这方面的专家,但问题似乎是在 gsubfun 中使用公式 replacement。至少我无法将环境传递给 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!