从 R 实现的承诺中获取价值

Taz*_*Taz 3 asynchronous future r promise

我读了很多关于R promises(包括这个)的文章,但仍然不明白。

见代码:

library(future)
library(promises)
plan(multiprocess)

read.csv.async <- function(file, header = TRUE, stringsAsFactors = FALSE) {
  future({
    read.csv(file, header = header, stringsAsFactors = stringsAsFactors)
  })
}

df_promise <- read.csv.async("https://rstudio.github.io/promises/data.csv")

df_promise %...>% filter(state == "NY")

df_filtered_promise <- df_promise %...>% filter(state == "NY")

df_filtered_promise

class(df_filtered_promise)
Run Code Online (Sandbox Code Playgroud)

输出:

> read.csv.async <- function(file, header = TRUE, stringsAsFactors = FALSE) {
+   future({
+     read.csv(file, header = header, stringsAsFactors = stringsAsFactors)
+   })
+ }
> 
> df_promise <- read.csv.async("https://rstudio.github.io/promises/data.csv")
> 
> df_promise %...>% filter(state == "NY")
> 
> df_filtered_promise <- df_promise %...>% filter(state == "NY")
> 
> df_filtered_promise
<Promise [pending]>
> df_filtered_promise
<Promise [fulfilled: data.frame]>
> class(df_filtered_promise)
[1] "promise"
Run Code Online (Sandbox Code Playgroud)

为什么fullfilled promise不返回它的值?在我的情况下如何提取数据框?

Joe*_*eng 5

有一种方法可以做到这一点,但在我告诉您之前,我建议您不要将 promise 用于交互或脚本用途,可能。同步编程比异步更方便,并且只有在不占用主 R 线程非常重要的情况下才应该使用后者(如果您希望在长时间操作运行时保持应用程序响应,Shiny 就是这种情况)。

如果您选择使用 future,请尽量避免%...>%在它之后链接任何操作,然后您就可以future::value像 Daniel Fischer 所说的那样简单地使用。

如果您确实决定完全使用 promise,并且将值提取到常规变量中对您很重要,那么您可以通过副作用来完成此操作,例如超级赋值:

df_filtered <- NULL
df_filtered_promise %...>% { df_filtered <<- . }
Run Code Online (Sandbox Code Playgroud)

这将导致df_filtered变量被设置为df_filtered_promise未来某个时刻的结果。(不过,它永远不会在出错的情况下被分配。)

这通常不应该在 Shiny 中完成,因为您通常希望在计算结束之前一直将事情包装在 promise 中,以便 Shiny 可以跟踪哪些输出/观察者正在等待哪些操作。


UD2*_*D22 5

df <-environment (promise_object[["then"]])[["private"]][["value"]] 是您正在寻找的。

Promise 对象以嵌套列表格式存储数据和属性,并且该列表是环境对象的一部分。

  • 您好,欢迎来到 Stack Overflow!请参加[游览](https://stackoverflow.com/tour)。感谢您的回答,但您能否添加有关您的代码如何解决问题的解释?检查[帮助中心](https://stackoverflow.com/editing-help)以获取有关如何格式化代码的信息。 (2认同)