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

时间:2016-07-21 18:59:55

标签: r function 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.)&amp; (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.)工作?

我使用environment()parent.frame()的{​​{1}}参数尝试了多项envireval变体,包括将gsubfn的环境传递给topfun通过省略号参数。一切都没有成功。 (并不是说我对引擎底下发生的事情有了更多的了解。但我希望R能够在一个又一个的父环境中继续寻找subfun ...)

我正在使用idR version 3.3.0包版本gsubfn

提前致谢!

1 个答案:

答案 0 :(得分:2)

我不是这方面的专家,但问题似乎是在replacement中使用公式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!