【问题标题】:Using delayed assignment in a function: How do I send the promise back to the parent environment?在函数中使用延迟分配:如何将承诺发送回父环境?
【发布时间】:2016-02-03 23:27:36
【问题描述】:

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

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,并且在需要时评估它们的“承诺”似乎没有实现。

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

【问题讨论】:

标签: r promise


【解决方案1】:

您的示例代码在 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
}

【讨论】:

  • 如果我使用的不是全局环境,而是调用loadLayers()的环境,如果需要访问dataset1,是直接使用dataset1,还是需要使用envir_name$ dataset1,其中envir_name是调用loadLayers的环境?
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2015-03-16
  • 2013-04-27
  • 2015-03-08
相关资源
最近更新 更多