有没有办法懒惰地加载列表中的元素?
我有一个很大的data.frames列表,每个都需要很长时间才能生成和加载。通常,我不会在会话期间使用所有的data.frames,所以我希望在我使用它们时延迟地生成和加载它们。我知道我可以使用delayedAssign创建延迟加载的变量,但这不能应用于列表元素。
下面是一个不起作用的可重复示例:
生成data.frames需要一段时间的一些函数:
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
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
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.发布于 2017-07-10 23:23:38
这是一个不完美的解决方案。这是不完美的,因为如果没有加载所有列表元素,列表就不能在Rstudio控制台中交互使用。特别是当输入$时,Rstudio会同时运行这两个函数。my_env$df_1上的Ctrl+Enter可以正常工作,所以问题出在控制台的使用上。
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']] https://stackoverflow.com/questions/45015916
复制相似问题