在 R 列表中存储函数
Storing functions in an R list
我正在尝试构建一个闪亮的应用程序来帮助进行决策分析。在应用程序的一部分中,用户需要将他们的效用函数作为文本输入,R/shiny 将转换为表达式。假设用户的效用函数有三个部分,它们将组合成一个更大的效用函数。我遇到的问题是在 for
循环中定义列表元素:
utility.fns <- list()
ufs <- list() ## user input
## each ufs is specified by the user
ufs[[1]] <- "x+1"
ufs[[2]] <- "sin(x)"
ufs[[3]] <- "cos(x)^2"
for(i in 1:3){
## turn the text into functions
utility.fns[[i]] <- function(x){
eval( parse(text = ufs[[i]]) )
}
}
utility.fns[[1]](1) ## returns cos(1)^2 ?
奇怪的是列表 utility.fns
总是 returns utility.fns[[3]]
,不管索引是什么。但是,手动覆盖
> utility.fns[[1]] <- function(x){
+ eval( parse(text = ufs[[1]]) )
+ }
> utility.fns[[1]](1)
[1] 2
修复了问题。显然我不能每次都手动覆盖!
之所以总是returns utility.fns[[3]]
是因为如果你勾选utility.fns
utility.fns[[1]]
#function(x){
# eval( parse(text = ufs[[i]]) )
#}
#<bytecode: 0x1223d31c8>
for 循环中的 i
在 3 处结束,所以它总是调用 ufs[[3]]
。
您可以保留 ufs
中的函数本身,将值赋给 x
,然后使用 eval
、parse
x <- 1
eval(parse(text = ufs[[1]]))
#[1] 2
eval(parse(text = ufs[[2]]))
#[1] 0.841
eval(parse(text = ufs[[3]]))
#[1] 0.292
使用 lapply
而不是 for
utility.fns <- lapply(1:3, function(i){function(x){eval(parse(text = ufs[[i]]) )}})
我正在尝试构建一个闪亮的应用程序来帮助进行决策分析。在应用程序的一部分中,用户需要将他们的效用函数作为文本输入,R/shiny 将转换为表达式。假设用户的效用函数有三个部分,它们将组合成一个更大的效用函数。我遇到的问题是在 for
循环中定义列表元素:
utility.fns <- list()
ufs <- list() ## user input
## each ufs is specified by the user
ufs[[1]] <- "x+1"
ufs[[2]] <- "sin(x)"
ufs[[3]] <- "cos(x)^2"
for(i in 1:3){
## turn the text into functions
utility.fns[[i]] <- function(x){
eval( parse(text = ufs[[i]]) )
}
}
utility.fns[[1]](1) ## returns cos(1)^2 ?
奇怪的是列表 utility.fns
总是 returns utility.fns[[3]]
,不管索引是什么。但是,手动覆盖
> utility.fns[[1]] <- function(x){
+ eval( parse(text = ufs[[1]]) )
+ }
> utility.fns[[1]](1)
[1] 2
修复了问题。显然我不能每次都手动覆盖!
之所以总是returns utility.fns[[3]]
是因为如果你勾选utility.fns
utility.fns[[1]]
#function(x){
# eval( parse(text = ufs[[i]]) )
#}
#<bytecode: 0x1223d31c8>
for 循环中的 i
在 3 处结束,所以它总是调用 ufs[[3]]
。
您可以保留 ufs
中的函数本身,将值赋给 x
,然后使用 eval
、parse
x <- 1
eval(parse(text = ufs[[1]]))
#[1] 2
eval(parse(text = ufs[[2]]))
#[1] 0.841
eval(parse(text = ufs[[3]]))
#[1] 0.292
使用 lapply
而不是 for
utility.fns <- lapply(1:3, function(i){function(x){eval(parse(text = ufs[[i]]) )}})