将字符串分配为变量

Assigning string as a variable

是否可以将包含变量名称的字符串分配给 R 中的变量?

例如,假设我有字符串 "log(p_n) + log((1 - p_n)) + log(p_n * p_b) + log(p_n * (1 - p_b)) + log((1 - p_n) * p_g)"。我想实现这个功能:

formula_function = function(p_n, p_b, p_g){
  x <- log(p_n) + log((1 - p_n)) + log(p_n * p_b) + log(p_n * (1 - p_b)) + log((1 - p_n) * p_g)
  return(x)
}

我有一个生成公式字符串的函数,目前我只是手动复制粘贴它们,还有更多 'program-y' 的方法吗?

1) body 假设你知道参数:

x <- "log(p_n) + log((1 - p_n)) + log(p_n * p_b) + log(p_n * (1 - p_b)) + log((1 - p_n) * p_g)"

f <- function(p_n, p_b, p_g) {}
body(f) <- parse(text = x)
f
## function (p_n, p_b, p_g) 
## log(p_n) + log((1 - p_n)) + log(p_n * p_b) + log(p_n * (1 - p_b)) +
##    log((1 - p_n) * p_g)

2) as.function gsubfn 包有一个将公式转换为函数的函数。形式参数的顺序将按照在 x 中遇到的顺序,或者您可以指定顺序。使用 reformulate 将字符串转换为公式,然后使用 as.function.

library(gsubfn)

# args are in order encountered
f <- as.function(reformulate(x))
f
## function (p_n, p_b, p_g) 
## log(p_n) + log((1 - p_n)) + log(p_n * p_b) + log(p_n * (1 - p_b)) + 
##    log((1 - p_n) * p_g)

# specify order of args
f <- as.function(reformulate(x, "p_n + p_g + p_b"))
f
## function (p_n, p_g, p_b) 
## log(p_n) + log((1 - p_n)) + log(p_n * p_b) + log(p_n * (1 - p_b)) + 
##     log((1 - p_n) * p_g)

3) match.funfn gsubfn 也有 match.funfn 类似于 R 中的 match.fun 除了它还将作为公式传递的参数转换为函数.例如

library(gsubfn)

myfun <- function(a, b, c, fun) {
  f <- match.funfn(fun)
  f(a, b, c)
}
myfun(0.1, 0.1, 0.1, reformulate(x, "p_n + p_g + p_b"))
## [1] -11.82901

4) fn$ gsubfn 还提供 fn,当它作为任意函数的前缀时,会将公式解释为函数。有关详细信息,请参阅帮助文件 ?fn。请注意,sapply 不是专门为此编写的,但它仍然可以工作。

library(gsubfn)

fn$sapply(1:3, ~ x^2)
## [1] 1 4 9