在函数中使用延迟分配:如何将承诺发送回父环境?

rui*_*sen 3 r promise

我想仅在需要数据时使用延迟分配从一组文件中加载一系列数据。但是由于这些文件将始终位于同一目录中(可能会四处移动),而不是对每个文件的位置进行硬编码(如果移动目录,稍后更改将很乏味),我只想简单地一个接受目录文件路径的函数。

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)
}
Run Code Online (Sandbox Code Playgroud)

因此,与其在开始时加载所有数据集,我希望仅在需要时才加载每个数据集(这会加快闪亮的应用程序的速度)。

但是,在函数中执行此操作时遇到了问题。当 delayAssign 不在函数中时它起作用,但是当我将它们放在函数中时,列表中的所有对象都只返回 null,并且在需要时评估它们的“承诺”似乎没有实现。

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

Sim*_*nek 6

您的示例代码在 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
}
Run Code Online (Sandbox Code Playgroud)