3

我是 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]))

该函数属于“语言”类型:

> 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以绘制它?

4

2 回答 2

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它都必须是一个实际的语句,而不是一个包含语句的调用。

于 2013-03-31T19:40:45.347 回答
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)
于 2013-04-01T12:40:48.817 回答