在引用的表达式中替换已知变量

时间:2013-12-22 20:29:55

标签: r expression eval quote

我想写一个给出的函数 f

x <- 1  
f(.(y==x))

返回字符串:

"y == 1"

该函数应该足够通用,表达式可以是任意的。例如,f(.(y==x & z==x))应该返回"y == 1 & z == 1"

有什么想法吗?

功能:

g <- function(e) as.character(unlist(e))

对我不起作用,因为它返回“y == x”。我希望更换。

更新

此外,这个问题不是How do I substitute symbols in a language object?的重复我想创建一个函数 f ,这意味着我需要以某种方式获取 x 来自来电者的环境。我目前的尝试是:

require(plyr)
x <- 1
f <- function(e) do.call(substitute, list(e[[1]], parent.frame(1)))
f(.(y==x & z==x))

但它仍然无效。也许我应该使用其他东西而不是parent.frame

非常感谢。

1 个答案:

答案 0 :(得分:1)

 library(plyr)
 g <- function(e) { 
      e[[1]][[3]] <- eval.parent(e[[1]][[3]])
      deparse(e[[1]]) 
 }
 x <- 1
 g(.(y==x))

这样可行,但可能不像你想要的那样通用。 (我希望有一个解决方案,如果可能的话替换值,否则就单独留下值。)

更新:尚未开始工作,但也许有帮助。

 g <- function(e) {
      e1 <- e[[1]]
      pe <- parent.env(environment())
      vars <- all.vars(e1)
      ss <- setNames(lapply(vars,
                   function(v) if (exists(v,pe)) get(v,pe) else v),
                     vars)
      ## at this point I'm stumped -- have tried various
      ## versions of eval, lapply, rapply, substitute ...
      ## afraid I would actually have to make up my own recursive
      ## function since rapply() only works on lists ...
 }