R类型转换表达式()函数()

And*_*000 9 expression r function type-conversion

我一直在尝试在R中编写一个实现Newton方法的程序.我一直很成功,但有两个小障碍一直困扰着我.这是我的代码:

Newton<-function(f,f.,guess){
    #f <- readline(prompt="Function? ")
    #f. <- readline(prompt="Derivative? ")
    #guess <- as.numeric(readline(prompt="Guess? "))
    a <- rep(NA, length=1000)
    a[1] <- guess
    a[2] <- a[1] - f(a[1]) / f.(a[1])
    for(i in 2:length(a)){
        if(a[i] == a[i-1]){
           break
        } 
        else{
           a[i+1] <- a[i] - f(a[i]) / f.(a[i])
        }
    }   
    a <- a[complete.cases(a)]
    return(a)
}
Run Code Online (Sandbox Code Playgroud)
  1. 我无法让R识别这些功能f,f.如果我尝试使用它readline()来提示用户输入.我得到错误"牛顿()中的错误:找不到函数"f.""但是,如果我注释掉readlines(如上所述),定义ff.事先,那么一切正常.

  2. 我一直试图让R计算函数的导数.问题是R可以使用符号导数的类对象是expression(),但我想取a的导数function()并让它给我一个function().简而言之,我在expression()和之间进行类型转换时遇到了问题function().

我从去一个丑陋的,但有效的解决方案function()expression().给定函数f,D(body(f)[[2]],"x")将给出导数f.但是,这个输出是一个expression(),我还没能把它变成一个function().我需要使用eval()什么?我尝试过子集,但无济于事.例如:

g <- expression(sin(x))
g[[1]]
sin(x)
f <- function(x){g[[1]]}
f(0)
sin(x)
Run Code Online (Sandbox Code Playgroud)

当我想要的是f(0)= 0,因为sin(0)= 0.

编辑:谢谢大家!这是我的新代码:

Newton<-function(f,f.,guess){
    g<-readline(prompt="Function? ")
    g<-parse(text=g)
    g.<-D(g,"x")
    f<-function(x){eval(g[[1]])}
    f.<-function(x){eval(g.)}
    guess<-as.numeric(readline(prompt="Guess? "))
    a<-rep(NA, length=1000)
    a[1]<-guess
    a[2]<-a[1]-f(a[1])/f.(a[1])
    for(i in 2:length(a)){
        if(a[i]==a[i-1]){break
        }else{
        a[i+1]<-a[i]-f(a[i])/f.(a[i])
        }
    }   
a<-a[complete.cases(a)]
#a<-a[1:(length(a)-1)]
return(a)
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 8

  1. 出现第一个问题是因为readline读取文本字符串,而您需要的是表达式.您可以使用parse()将文本字符串转换为表达式:

    f <-readline(prompt="Function? ")
    sin(x)
    f
    # [1] "sin(x)"
    
    f <- parse(text = f)
    f
    # expression(sin(x))
    
    g <- D(f, "x")
    g
    # cos(x)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要在表达式(whew!)中传递函数调用中的参数值,可以eval()在包含提供的值的环境中传递它.很好,R将允许您在提供给以下envir=参数的列表中提供这些值eval():

    > eval(f, envir=list(x=0))
    # [1] 0
    
    Run Code Online (Sandbox Code Playgroud)