R类型转换表达式()函数()
我一直在尝试用 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)
}
如果我尝试使用
readline()
,我无法让 R 识别函数f
和f.
提示用户输入。我收到错误“Newton() 中的错误:找不到函数“f”。”但是,如果我注释掉读取行(如上所述),请定义f
和f。 事先,然后一切正常。
我一直在尝试让 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)
}
I've been trying to write a program in R that implements Newton's method. I've been mostly successful, but there are two little snags that have been bothering me. Here's my code:
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)
}
I can't get R to recognize the functions
f
andf.
if I try usingreadline()
to prompt for user input. I get the error "Error in Newton() : could not find function "f."" However, if I comment out the readlines (as above), definef
andf.
beforehand, then everything works fine.I've been trying to make R calculate the derivative of a function. The problem is that the class object with which R can take symbolic derivatives is
expression()
, but I want to take the derivative of afunction()
and have it give me afunction()
. In short, I'm having trouble with type conversion betweenexpression()
andfunction()
.
I have an ugly but effective solution for going from function()
to expression()
. Given a function f, D(body(f)[[2]],"x")
will give the derivative of f
. However, this output is an expression()
, and I haven't been able to turn it back into a function()
. Do I need to use eval()
or something? I've tried subsetting, but to no avail. For instance:
g <- expression(sin(x))
g[[1]]
sin(x)
f <- function(x){g[[1]]}
f(0)
sin(x)
when what I want is f(0) = 0 since sin(0) = 0.
EDIT: Thanks all! Here's my new code:
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)
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
出现第一个问题是因为
readline
读取的是文本字符串,而您需要的是表达式。您可以使用parse()
将文本字符串转换为表达式:要在表达式中的函数调用中传入参数值(哇!),您可以
eval ()
它位于包含所提供值的环境中。很好的是,R 将允许您在提供给eval()
的envir=
参数的列表中提供这些值:<前><代码>>评估(f,环境=列表(x=0))
# [1] 0
This first problem arises because
readline
reads in a text string, whereas what you need is an expression. You can useparse()
to convert the text string to an expression:To pass in values for the arguments in the function call in the expression (whew!), you can
eval()
it in an environment containing the supplied values. Nicely, R will allow you to supply those values in a list supplied to theenvir=
argument ofeval()
:乔希已经回答了你的问题
对于第 2 部分,你可以使用
Josh has answered your question
For part 2 you could have used
顺便说一句,最近编写了一个基于复平面中牛顿法的根收敛来计算分形图案的玩具,我可以建议您添加如下代码(其中主函数的参数列表包括“func”和“varname”) 。
如果您更谨慎,您可以包含一个参数 "funcderiv" ,并将我的代码包装在
Ahh 中,为什么不呢:这是我的完整函数,供所有人使用和享受:-)
BTW, having recently written a toy which calculates fractal patterns based on root convergence of Newton's method in the complex plane, I can recommend you toss in some code like the following (where the main function's argument list includes "func" and "varname" ).
If you're more cautious, you could include a an argument "funcderiv" , and wrap my code in
Ahh, why not: here's my complete function for all to use and enjoy:-)