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

标签 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

非常感谢。

最佳答案

 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 ...
 }

关于r - 替换引用表达式中的已知变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20733742/

相关文章:

r - 确定列值在 data.table 中是否唯一

r - 使用 List 将 R 矩阵转换为 arma::mat

c++ - C++ 中的 bool 表达式解析器

python - 使用 eval 对列表求和

performance - javascript shell 与 pymongo 中 db.eval() 的 MongoDB 性能

r - 如何根据先前值的减少百分比将向量/变量分离为两种状态

r - 在 R : find all unique values in column separated by comma

regex - Oracle 正则表达式中的高代理检测

c# - LambdaExpression 构造函数

r - 在不附加包的情况下评估包环境中的功能