我想使用delayedAssign仅在需要数据时从一组文件加载一系列数据。但由于这些文件将始终位于同一目录中(可能会被移动),而不是硬编码每个文件的位置(如果目录被移动,以后更改将会很繁琐),我想简单地制作一个接受目录文件路径的函数。
loadLayers <- function(filepath) {
delayedAssign("dataset1", readRDS(file.path(filepath, "experiment1.rds")))
delayedAssign("dataset2", readRDS(file.path(filepath, "experiment2.rds")))
delayedAssign("dataset3", readRDS(file.path(filepath,"experiment3.rds")))
return (list <- (setOne = dataset1, setTwo = dataset2, setThree = dataset3)
}
因此,我不想在开始时加载所有数据集,而是希望只在需要时加载每个数据集(这会加速闪亮的应用程序)。
但是,在函数中执行此操作时遇到问题。当delayedAssign不在函数中时它起作用,但是当我把它们放在一个函数中时,列表中的所有对象都只返回null,并且在需要时评估它们的“promise”似乎没有实现。
实现这一目标的正确方法是什么? 感谢。
答案 0 :(得分:3)
您的示例代码在R中不起作用,但即使在概念上,您使用的是delayedAssign
,然后您通过在return()
中引用它来立即解决它,因此无论如何您最终都会加载所有内容。为清楚起见,分配将符号绑定到环境中的值。所以为了使它有任何意义,你的函数必须返回环境,而不是列表。或者,您可以简单地使用全局环境,并且当您将其用于副作用时,该函数不需要返回任何内容。
loadLayers <- function(filepath, where=.GlobalEnv) {
delayedAssign("dataset1", readRDS(file.path(filepath, "experiment1.rds")),
assign.env=where)
delayedAssign("dataset2", readRDS(file.path(filepath, "experiment2.rds")),
assign.env=where)
delayedAssign("dataset3", readRDS(file.path(filepath, "experiment3.rds")),
assign.env=where)
where
}