在R

时间:2016-06-22 06:45:30

标签: r function

我正在尝试使用包multiroot中的rootSolve函数来解决R中的隐式方程。

我正在使用parse从文本文件中读取隐式等式。此外,要解决的变量从文本文件中读取为字符。

使用multiroot

multiroot(function, initial_guess, ....))

我们必须从读取的等式中生成一个函数。

我这样做了
fun <- function(op) {fun <- eval(expr.im)}
op = as.name(opim.names)

其中expr.im是读隐式等式作为文本文件中的表达式,opim.names是要作为字符解决的变量。

但是当我将要解析的变量op作为符号传递给函数时,问题就出现了。它给出了一个错误,说明了对象

  

&#34;要解决的变量&#34;没找到。

我认为变量符号没有在函数中正确传递。

请告诉我如何正确地做到这一点。

由于我的代码中有很多内容,我不能在这里发布整个内容。 让我举一个小例子。

var.name = "x1" # This is what I read from the text file #
var.sym = as.name(var.name)

func <- function(var.sym){
func = x1^2      # the expression x1^2 is also read from a text file  #
}                  # I am trying to solve the implicit equation x1^2 = 0  #
initial_guess = 1
root = multiroot(f=func, start = initial_guess)

按照尼古拉的要求,这就是我想要的 - 我有一个文本文件给我变量的名称和它的初始猜测。 我将变量名称(例如&#34; x&#34;)和初始猜测值(比如1)读入变量var(字符)和guess(数字)。 我还有另一个包含以下等式的文本文件 -

x^3-1

我把它读作变量expr中的表达式。

我想找到隐式方程expr的解。 (文本文件可以有不同的变量名称,相应地是另一个文件中的隐式表达式)

如您所知,对于使用多根功能,我们需要一个功能。 问题是我无法将var中存储的变量名称传递给函数。

如果被问及,将会给予进一步的澄清。

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式构建您的功能。

#input: function expression, variable names and initial guess
expr<-"x^3-1"
var.name<-"x"
initial.guess<-2
#we build an "empty" function
func<-function() {}
#now we set the formal arguments and the body of the function
formals(func)<-eval(parse(text=paste0("alist(",paste(var.name,collapse="=,"),"=)")))
body(func)<-parse(text=expr)
#we can see that func is correctly defined
func
#function (x) 
#x^3 - 1
#now we can call multiroot
multiroot(func,initial.guess)
#$root
#[1] 1
#$f.root
#[1] 3.733019e-08
#$iter
#[1] 6
#$estim.precis
#[1] 3.733019e-08

如果要处理多个变量的函数,则需要更加小心。请参阅?multiroot以查看如何传递参数。基本上你必须只传递一个参数,它是所有函数参数的向量。如果你花点时间看看我是如何建立func的,那应该不难。如果您只处理一个变量函数,则应使用基本uniroot函数。

答案 1 :(得分:0)

无法完全理解说明。但要回答标题,您可以尝试这个程序 -

a = "random_string"
b = "a"
eval(parse(text = b))
[1] "random_string"