将字符串分配为变量
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
是否可以将包含变量名称的字符串分配给 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