在函数中使用延迟赋值:如何将promise发送回父环境?

时间:2016-02-03 23:27:36

标签: r promise

我想使用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”似乎没有实现。

实现这一目标的正确方法是什么? 感谢。

1 个答案:

答案 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
}