2016-12-28 10 views
1

У меня есть следующая проблема: я пишу функцию, которая сначала строит длинную строку символов, которая обозначает математическую функцию, например. "1/(1 + ехр (-x1 + 4x3))". Теперь я хочу максимизировать эту функцию, но, к сожалению, я не могу этого сделать, потому что математическая функция сохраняется только как строка символов, а не как R-функция. Как я могу решить эту проблему? Заранее спасибо!Максимизация математической функции, которая сохраняется как строка символов

+0

'4x3' не работает, даже если это не строка. Вы имеете в виду '4 * x3'? –

+0

Да, ты прав. Я забыл «*». Простите за это! –

ответ

1

Если мы знаем, что аргументы опережают время, тогда (1) было бы предпочтительнее, так как оно проще (4 строки кода), но если мы этого не сделаем, тогда (2) также будут покрывать их (8 строки кода).

1) динамическое тело Это будет преобразовать строку s в функцию f2 из 2 аргументов, которые мы можем назвать из f1, имеющих один аргумента в соответствии с требованиями optim:

s <- "1/(1+exp(-x1+4*x3))" # test input 

f1 <- function(x) do.call("f2", as.list(x)) # f1 calls f2 

f2 <- function(x1, x3) {} 
body(f2) <- parse(text = s) 

optim(c(0, 0), f1, control = list(fnscale = -1)) 

2) динамическое телом + dynamic args В приведенном выше примере мы динамически создавали тело из строки, предполагая, что мы знаем аргументы, но если вы хотите динамически создавать как тело, так и аргументы, попробуйте это. Здесь f2 больше не обязательно имеет 2 аргумента, но имеет nv аргументы и то, что они получены на основе ввода s.

s <- "1/(1+exp(-x1+4*x3))" # test input - same as above 

f1 <- function(x) do.call("f2", as.list(x)) # function on one argument - same as above 

# f2 has nv arguments 
f2 <- function() {} 
p <- parse(text = s) 
v <- all.vars(p) # character string of variable names used for arguments 
nv <- length(v) 
formals(f2) <- setNames(rep(alist(x=), nv), v) 
body(f2) <- p 

optim(numeric(nv), f1, control = list(fnscale = -1)) # first arg different from (1) 
+0

Спасибо вам большое! Это было действительно полезно. –

0

Я пишу функцию, которая строит первую длинную строку символов, которая выступает за математическую функцию

Не делайте этого. Я уверен, что есть лучший подход.

, потому что математическая функция сохраняется только в виде строки символов, а не как R-функции

Вы должны были бы разобрать строку (после Правомерно синтаксис R):

expr <- parse(text = gsub("((?<=\\d)[[:alpha:]])", "\\*\\1","1/(1+exp(-x1+4x3))", perl = TRUE)) 

Затем вы можете использовать это выражение, чтобы «найти максимум» любым способом, который вы хотели бы использовать.

Однако, как fortune 106 говорит:

Если ответ синтаксического анализа() вы должны, как правило, пересмотреть вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^