更改不带引号的函数体

Change the body of a function without quote marks

我需要根据用户给出的输入更改函数的主体。

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]))

但是,我需要使用 <- 右侧 。在这些情况下,计算公式会产生错误。

我也试过 noquote 仍然给出引号:

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

最后,我尝试了 expr(!!userinput)subs() 的不同组合替换.

假设所需的输入是

  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