提供两个功能
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}}参数尝试了多项envir
和eval
变体,包括将gsubfn
的环境传递给topfun
通过省略号参数。一切都没有成功。 (并不是说我对引擎底下发生的事情有了更多的了解。但我希望R能够在一个又一个的父环境中继续寻找subfun
...)
我正在使用id
和R version 3.3.0
包版本gsubfn
。
提前致谢!
答案 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!