我是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
以进行绘制?
答案 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)