试图在曲线()中使用eval(解析(text = function()))

时间:2016-01-05 19:48:54

标签: r eval

我创建了一个函数,使得该等式用于在多项式回归中生成回归曲线,但我不能使它在curve()上工作

有功能本身,工作正常。

`$

Curve.equation=function(x)
{
   coeffs=x$coefficients
   eqq=character()
   for(i in 1:length(coeffs))
   {
      if(i==1){eqq[i]=coeffs[i]}
      if(grepl("\\^",names(coeffs[i])))
      {
         num=grep("\\^",unlist(strsplit(names(coeffs[i]),"")))+1
         eqq[i]=ifelse(substring(coeffs[i],1,1)=="-",paste0(coeffs[i],"*x^",substring(names(coeffs)[i],num,num)),paste0("+",coeffs[i],"*x^",substring(names(coeffs)[i],num,num)))
      }
      if(!grepl("\\^",names(coeffs[i]))&i>1)
      {
         eqq[i]=ifelse(substring(coeffs[i],1,1)=="-",paste0(coeffs[i],"*x"),paste0("+",coeffs[i],"*x"))
      }
   }
   paste(eqq,collapse="")
}`
模拟数据
`$
fn=function(x)15+2.5*x+2*x^2+x^3+50*rnorm(length(x),100,100)
a=rnorm(200,30,3)
b=fn(a)
plot(b~a)
lmab=lm(b~a+I(a^2)+I(a^3))

`

......这就是我遇到问题的地方。 我试着

$ curve(Curve.equation(lmab),add=TRUE,col="blue")

$ curve(eval(parse(text=Curve.equation(lmab))),add=TRUE,col="blue")

,但这两行都归还给我 'expr'必须是一个函数,或一个包含'x'

的调用或表达式

1 个答案:

答案 0 :(得分:0)

返回长度为1的R字符向量:

Curve.equation(lmab)
[1] "-26488.6153547735+4928.74310702739*x-217.568666179266*x^2+4.00331698261622*x^3"

这将允许您获取该字符值并将其放入“空白”功能对象中。不需要eval,因为parse会返回必要的表达式。它执行测试是否可以从该字符值构建有效的R表达式树:

func <- function(x){}
    body(func) <- parse(text=Curve.equation(lmab))


> func
function (x) 
-26488.6153547735 + 4928.74310702739 * x - 217.568666179266 * 
    x^2 + 4.00331698261622 * x^3

由于func现在是一个带有一个名为“x”的形式参数的函数,curve - 函数很高兴:

png(); curve(func, -10,10); dev.off()

enter image description here