Превратить строку в объект - но к реальному тексту, не оценивается - PullRequest
0 голосов
/ 12 марта 2019

Не думаю, что это дубликат, так как я хочу, чтобы фактический код / ​​текст не оценивался.

Я строю функцию, которая требует, чтобы входные данные были похожи на следующие:

compss[[1]](x[1],x[2])

Где compss - это список функций, и я вызываю первую функцию в списке и использую параметры x [1] и x [2].

Вопрос

Я хочу построить общий случай так, чтобы, когда у меня было более 2 переменных, я получал:

compss[[1]](x[1],x[2],x[3],.....)

(Как, например, я набираю n = 5, и я получаюфактический код выше, но с точностью до x [5])

Мой неудачный подход

Поэтому моя первоначальная мысль - сначала создать вектор с n "x [i]'s',

argss <- NULL
  for (i in 1:length(variable.limits)){
    argss <- c(argss, text = paste("x","[", i, "]", sep =""))
  }

Что дает:

"x[1]" "x[2]" ....

Тогда я подумал, что использование разбора поможет, но это дает:

expression(x[1], x[2])

Что было бы хорошои я мог бы использовать do.call и т. д. Но проблема в том, что я просто хочу символы / объекты / переменные там.Причина в том, что я запускаю это в функции оптимизации, где x [1] не имеет заданного значения, и поэтому do.call, похоже, не работает.Есть идеи?

Комментарии отклика

В ответ на комментарии r2evans решение использовать:

list_of_xs <- list(x[1], x[2], x[3])
do.call(compss[[1]], list_of_xs)

Вероятно, это лучший способ решитьэто, так что теперь остается только один вопрос: как обобщить «list_of_xs».

Мой пример использования - разработка функции стоимости для нелинейного программирования:

func <- function(x){
x[1]*x[2]*x[3] + (x[1]^2 - x[3]*x[2])
}

Но япытаясь спроектировать это в моей структуре, чтобы это работало для общих задач, где у нас может быть, скажем, х [100].Пакет, который я использую, а именно «nloptr», требует от вас ввода функции стоимости в определенной форме, я думаю, я новичок в этом пакете.

1 Ответ

3 голосов
/ 12 марта 2019

Сначала создайте представление символа в txt, а затем используйте parse для этого.Используйте [[1]] для проанализированного объекта, чтобы получить объект call, который, как я полагаю, является тем, что вам нужно.

n <- 3
txt <- sprintf("compss[[1]](%s)", toString(paste0("x[", 1:n, "]")))
cobj <- parse(text = txt)[[1]]
cobj
## compss[[1]](x[1], x[2], x[3])

# check that we can evaluate cobj
compss <- list(function(a, b, c) a + b + c)
x <- 1:3
eval(cobj)
## [1] 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...