以下作品:
plot(Sepal.Length ~ Petal.Width, data = iris)
abline(lm(Sepal.Length ~ Petal.Width, data = iris))
但是以下代码不起作用:
str = "Sepal.Length ~ Petal.Width, data = iris"
plot(str)
abline(lm(str))
我尝试了deparse(替代),as.forumla和eval,但它们不起作用。
答案 0 :(得分:2)
使用问题中的str
试试这个:
# fun and args should each be a character string
run <- function(fun, args) eval(parse(text = sprintf("%s(%s)", fun, args)))
run("plot", str)
abline(run("lm", str))
或试试这个:
`%(%` <- function(fun, args) run(deparse(substitute(fun)), args)
plot %(% str
abline(lm %(% str)
请注意,此方法可以处理参数中有逗号(与参数分隔符相对)并且不使用任何外部包的情况。
答案 1 :(得分:2)
尝试解析参数并创建它们:
fun_str<- function(fun, str_arg){
## split args separted by comma
m <- as.list(strsplit(str_arg,',')[[1]])
args <- lapply(m,function(x){
## remove any extra space
arg = str_trim(strsplit(x,'=')[[1]])
if (arg[1]=="data") get(arg[2],parent.frame())
else if (grepl('~',x)) as.formula(x)
})
do.call(fun,args)
}
然后叫它:
fun_str("plot",str)
fun_str("lm",str)
答案 2 :(得分:2)
这是另一种选择。您可以使用call
对象来表示data
参数,然后在参数列表中对其进行评估。
f <- formula("Sepal.Length ~ Petal.Width")
cl <- call("=", "data", iris)
plot(f, eval(cl))
abline(lm(f, eval(cl)))
看起来这个替代解决方案也适用于原始str
向量。
str <- "Sepal.Length ~ Petal.Width, data = iris"
s <- strsplit(str, ", data = ")[[1]]
with(setNames(as.list(s), c("formula", "data")), {
getd <- get(data, parent.frame())
plot(f <- formula(formula), data = getd)
abline(lm(f, data = getd))
})