首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数存储在R列表中

将函数存储在R列表中
EN

Stack Overflow用户
提问于 2020-04-08 14:51:22
回答 2查看 241关注 0票数 0

我正在尝试构建一个闪亮的应用程序来帮助进行决策分析。在应用程序的一部分,用户需要以文本的形式输入他们的实用函数,R/shiny会将其转换为表达式。假设用户的效用函数有三个部分,它们将被组合成一个更大的效用函数。我遇到的问题是在for循环中定义列表元素:

代码语言:javascript
复制
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总是返回utility.fns[[3]]。但是,手动重写

代码语言:javascript
复制
> utility.fns[[1]] <- function(x){
+   eval( parse(text = ufs[[1]]) )
+ }
> utility.fns[[1]](1)
[1] 2

修复了该问题。显然,我不能每次都手动覆盖!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-08 15:01:23

它总是返回utility.fns[[3]]的原因是因为如果您选中utility.fns

代码语言:javascript
复制
utility.fns[[1]]

#function(x){
#    eval( parse(text = ufs[[i]]) )
#}
#<bytecode: 0x1223d31c8>

for循环中的i结束于3,因此它总是调用ufs[[3]]

您可以将函数保留在ufs本身中,将值赋给x,然后使用evalparse

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-04-08 15:37:09

使用lapply而不是for

代码语言:javascript
复制
utility.fns <- lapply(1:3, function(i){function(x){eval(parse(text = ufs[[i]]) )}})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61094854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档