Изменить тело функции без кавычек - PullRequest
0 голосов
/ 28 сентября 2019

Мне нужно изменить тело функции в зависимости от ввода данных пользователем.

modelstring <- function() {
  for (h in (l1i1[j]):(l1i2[j])) {
    w[h] <- 1/l1n[h]
  }
}

userinput <- "b.w[1]*X.w[i,1]^exp(b.w[2]*X.w[i,2])"

body(modelstring)[[2]][[4]][[2]][[3]] <- userinput 

Проблема состоит в том, что измененная функция содержит кавычки .Как мне от них избавиться?

modelstring

function () 
{
    for (h in (l1i1[j]):(l1i2[j])) {
        w[h] <- "b.w[1]*X.w[i,1]^exp(b.w[2]*X.w[i,2])"
    }
}

При оценке пользовательского ввода в качестве формулы замена выполняется и кавычки не вставляются

userinput <- as.formula(w ~ b.w[1]*X.w[i,1]^exp(b.w[2]*X.w[i,2]))

Однако мне нужно использовать <- </strong> илитолько правая сторона .В этих случаях вычисляется формула, которая выдает ошибку.

Я также пытался noquote , которая по-прежнему дает кавычки:

userinput <- noquote("b.w[1]*X.w[i,1]^exp(b.w[2]*X.w[i,2])")

Наконец, у меня естьпробовал разные комбинации expr (!! userinput) , subs () и заменитель .

1 Ответ

2 голосов
/ 28 сентября 2019

Предполагая, что желаемыми входными данными являются

  1. функция modelstring и
  2. текст замены в виде строки символов, userinput

используйте parse, чтобы преобразовать строку в выражение, а затем добавьте [[1]] в конце, чтобы преобразовать это выражение из объекта вызова:

userinput <- "b.w[1]*X.w[i,1]^exp(b.w[2]*X.w[i,2])" # as in question
body(modelstring)[[2]][[4]][[2]][[3]] <- parse(text = userinput)[[1]]

modelstring
## function () 
## {
##     for (h in (l1i1[j]):(l1i2[j])) {
##         w[h] <- b.w[1] * X.w[i, 1]^exp(b.w[2] * X.w[i, 2])
##     }
## }

Вот более простой пример, которыйможет быть полезно поиграть с:

# inputs
f <- function() { 37 }
s <- "pi * pi"

body(f)[[2]] <- parse(text = s)[[1]]
f()
## [1] 9.869604
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...