如何在R中使用字符串作为代码

时间:2014-11-02 13:05:09

标签: r

以下作品:

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,但它们不起作用。

3 个答案:

答案 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))
})