R类型转换expression()function()

标签 r function expression type-conversion

我一直在尝试用R编写一个实现牛顿方法的程序。我大部分时候都取得了成功,但是有两个小障碍困扰着我。这是我的代码:

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)
}
  • 如果尝试使用f提示用户输入,我将无法通过R识别函数f.readline()。我收到错误“Newton()中的错误:找不到函数“f。”。”但是,如果我注释掉了读取行(如上所述),请事先定义ff.,那么一切正常。
  • 我一直在尝试让R计算函数的导数。问题是R可以采用符号导数的类对象是expression(),但是我想采用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)
    

    当我想要的是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)
    }
    

    最佳答案

  • 出现第一个问题是因为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)
    
  • 要将表达式中的函数调用中的参数值传递给表达式(whew!),您可以在包含提供的值的环境中对其进行eval()编码。很好,R允许您在提供给envir=eval()参数的列表中提供这些值:
    > eval(f, envir=list(x=0))
    # [1] 0
    
  • 关于R类型转换expression()function(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857042/

    相关文章:

    r - gt 表中的十进制对齐数字列

    r - 不均匀类别上的小平面条形图

    javascript - 使用 Javascript 将文本字段添加到 HTML 表单时出错

    python - 代码不起作用,期望程序打印,但没有打印任何内容

    r - 使用 metafor 包将科学记数法中的标签添加到森林图中

    r - 包 RQuantLib 不适用于 R 3.5.0

    r - 将标签网格移至绘图左侧

    r - 高级 R 函数调用

    c# - 使用递归创建 (Lambda) 表达式

    java - 将变量/数组与表达式分开,并删除重复项?