将“language”类型转换为“expression”

时间:2013-03-31 19:14:00

标签: r plot expression curve coercion

我是R的新手,我经常对数据结构感到困惑,这些数据结构要么不存在,要么我不需要其他语言。

目前,我正在尝试将“语言”类型的对象转换为“表达式”,以便我可以绘制它。

首先我创建我想要绘制的函数:

> model <- nls(y~a+b*exp(x*z),start = list(a=1, b = -.5, z = -.8),data=results)  
> modelsym <- substitute(a+b*exp(z*x), list(a=coef(model[1],b=coef(model)[2],z=coef(model)[3]))

该函数的类型为“language”:

> modelsym  
0.958945264470923 + -0.463676594301167 * exp(-0.155697065390677 * x)  
> typeof(modelsym)  
[1] "language"

如果我试图绘制这条曲线:

> curve(modelsym)  
Error in eval(expr, envir, enclos) : could not find function "modelsym"

但是,如果我复制并粘贴它可以正常工作:

> curve(0.958945264470923 + -0.463676594301167 * exp(-0.155697065390677 * x))  
**[plot appears here]**

我试过as(modelsym,expression)无济于事。

如何将对象modelsym转换为expression以进行绘制?

2 个答案:

答案 0 :(得分:3)

这不是一个完整的解决方案,但我已经接近:

do.call(curve, list(expr = modelsym))

基本上为您安排curve的调用,expr参数设置为modelsym的内容。

您尝试失败的原因是curve的第一行是

sexpr <- substitute(expr)

在传递包含语句的对象(实际上是任何对象)时给出了这个结果:

Browse[2]> sexpr
modelsym
Browse[2]> is.call(sexpr)
[1] FALSE
Browse[2]> is.expression(sexpr)
[1] FALSE

这两个测试是curve用来查看输入是否可接受的。

无论你传递的是什么curve,它都需要是一个实际的陈述,而不是一个包含一个陈述的召唤。

答案 1 :(得分:3)

另一种攻击计划是使用预测:

model <- nls(y~a+b*exp(x*z),start = list(a=1, b = -.5, z = -.8),data=results)

modelf <- function(x) predict(model, newdata = data.frame(x = x))
plot(modelf)
curve(modelf)