我想写一个给出的函数 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
?
非常感谢。
答案 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 ...
}