首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中列表元素的延迟求值

R中列表元素的延迟求值
EN

Stack Overflow用户
提问于 2017-07-10 23:23:38
回答 2查看 471关注 0票数 2

有没有办法懒惰地加载列表中的元素?

我有一个很大的data.frames列表,每个都需要很长时间才能生成和加载。通常,我不会在会话期间使用所有的data.frames,所以我希望在我使用它们时延迟地生成和加载它们。我知道我可以使用delayedAssign创建延迟加载的变量,但这不能应用于列表元素。

下面是一个不起作用的可重复示例:

生成data.frames需要一段时间的一些函数:

代码语言:javascript
运行
复制
slow_fun_1 <- function(){
  cat('running slow function 1 now \n')
  Sys.sleep(1)
  df<-data.frame(x=1:5, y=6:10)
  return(df)
}

slow_fun_2 <- function(){
  cat('running slow function 2 now \n')
  Sys.sleep(1)
  df<-data.frame(x=11:15, y=16:20)
  return(df)
}

方法1

代码语言:javascript
运行
复制
my_list <- list()
my_list$df_1 <-slow_fun_1()
my_list$df_2 <-slow_fun_2()
# This is too slow. I might not want to use both df_1 & df_2.

方法2

代码语言:javascript
运行
复制
my_list_2 <- list()
delayedAssign('my_list_2$df_1', slow_fun_1())
delayedAssign('my_list_2$df_2', slow_fun_2())
# Does not work. Can't assign to a list. 
my_list_2 #output is still an empty list.
EN

Stack Overflow用户

发布于 2017-07-10 23:23:38

这是一个不完美的解决方案。这是不完美的,因为如果没有加载所有列表元素,列表就不能在Rstudio控制台中交互使用。特别是当输入$时,Rstudio会同时运行这两个函数。my_env$df_1上的Ctrl+Enter可以正常工作,所以问题出在控制台的使用上。

代码语言:javascript
运行
复制
my_env <- new.env()
delayedAssign('df_1',slow_fun_1(),assign.env = my_env)
delayedAssign('df_2',slow_fun_2(),assign.env = my_env)
# That was very fast!  
get('df_1',envir = my_env)
my_env$df_1
# only slow_fun_1() is run once my_env$df_1 is called. So this is a partial success. 

# however it does not work interactively in Rstudio 
# when the following is typed into the console:
my_env$
# In Rstudio, once the dollar sign is typed, both functions are run.  

# this works interactively in the Rstudio console. 
# But the syntax is less convenient to type.
my_env[['d']] 
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45015916

复制
相关文章

相似问题

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