2016-06-22 2 views
0

Я пытаюсь решить неявное уравнение в R, используя функцию 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, чтобы решить ее как символ функции. Это дает ошибку, говорящую о том, что объект

«переменная, подлежащая решению для» не найдена.

Я думаю, что символ переменной не передается правильно в функции.

Пожалуйста, расскажите, как это сделать правильно.

Поскольку в моем коде много чего происходит, я не могу опубликовать все это здесь. Позвольте мне указать небольшой пример этого.

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) 

В соответствии с просьбой Nicola вот что я хочу - У меня есть текстовый файл, давая мне имя переменной и ее первоначальное предположение. Я прочитал имя переменной (скажем, «x») и начальное значение предположения (скажем 1) в переменные var (символ) и guess (числовые). У меня также есть еще один текстовый файл, содержащий следующее уравнение -

x^3-1 

Я прочитал это как выражение в переменной expr.

Я хочу найти решение неявного уравнения expr. (Текстовые файлы могут иметь разные имена переменных и, соответственно, неявное выражение в другом файле)

Как известно, для использования функции многолучевого ввода нам необходимо иметь функцию. Проблема заключается в том, что я не могу передать имя переменной, сохраненную в var, функции.

Любые дополнительные разъяснения будут даны, если будут предложены.

+0

Второй аргумент 'multiroot' должен быть числовым вектором. Почему вы проходите мимо символов? Дайте больше информации и попытайтесь создать воспроизводимый пример. Скорее всего, вы используете 'multiroot' неправильно. – nicola

+0

Функция «multroot» @nicola принимает значения угадывания как второй аргумент. Я правильно даю оценки. Я пытаюсь передать имя переменной (которое я прочитал из файла в виде строки) в функцию. –

+0

Вы не определяете функцию 'func' правильно. В этом определении есть несколько проблем. Строка 'var.sym' ничего не добавляет к определению функции; знаете ли вы о различии между объектом и аргументом функции? Просто определите функцию func <-function (x) x^2', и ваш пример работает. – nicola

ответ

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.

+0

Большое спасибо !!! Вы не можете себе представить, насколько это помогло мне в моем проекте. –

0

Не можете понять описание целиком. Но чтобы ответить на заголовок, вы можете попробовать эту процедуру.

a = "random_string" 
b = "a" 
eval(parse(text = b)) 
[1] "random_string" 
Смежные вопросы