从函数内输出R语法

时间:2018-01-18 18:02:35

标签: r string function output

我正在教授一个统计课程,我试图轻轻地向学生介绍R语法(特别是ggplot)。为此,我为许多基本命令创建了包装函数。例如:

basic.plot.function = function(x,y, data=d){
    p = ggplot(data, aes_string(x=x, y=y)) + geom_point() + geom_smooth()
    print(p)
    #dput(p) # this function isn't doing what I want it to
}

我希望函数输出图(这是print(p)的作用),但我也希望它向控制台写入用于创建它的实际代码。换句话说,如果用户键入:

mydata = data.frame(x1 = runif(100), x2 = runif(100))
basic.plot.function("x1","x2", data=mydata)

我希望它输出:

ggplot(mydata, aes_string(x="x1", y="x2")) + geom_point() + geom_smooth()

我有什么想法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

解决方案

library(ggplot2)
basic.plot.function = function(x, y, data = d){
    call <- paste0('ggplot(', deparse(substitute(data)), ', aes_string(x=',
                   deparse(substitute(x)), ', y=', deparse(substitute(y)),
                   ')) + geom_point() + geom_smooth()')
    p <- eval(parse(text = call))
    print(p)
    print(call)
}

实施例

data("iris")
basic.plot.function('Sepal.Length', 'Sepal.Width', iris)

> basic.plot.function('Sepal.Length', 'Sepal.Width', iris)
`geom_smooth()` using method = 'loess'
[1] "ggplot(iris, aes_string(x=\"Sepal.Length\", y=\"Sepal.Width\")) + geom_point() + geom_smooth()"

enter image description here

解释

desparse(substitute(x))将参数x转换为字符串。您可以使用它来打印函数调用的字符串,以便在打印ggplot对象时进行打印。您可以使用eval(parse())评估该字符串以生成ggplot对象。