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

问题描述 投票:0回答:4

我读了很多关于

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)

输出:

> 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"

为什么 fullfilled

promise
不返回其值?我如何提取我的案例中的数据框?

r asynchronous promise future
4个回答
9
投票

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

如果您选择使用 future,请尽量不要在其后链接任何

%...>%
操作,然后您可以像 Daniel Fischer 所说的那样简单地使用
future::value

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

df_filtered <- NULL
df_filtered_promise %...>% { df_filtered <<- . }

这将导致

df_filtered
变量在未来某个时刻被设置为
df_filtered_promise
的结果。 (不过,如果出现错误,它永远不会被分配。)

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


5
投票

df<- environment (promise_object[["then"]])[["private"]][["value"]] is what you are looking for.

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


0
投票
promise %>% 
  {.$then} %>% 
  environment %>% 
  {.$private$value}

你可以试试这个。

如果

promise
未填写,则会返回
NULL


例如

seq(3) %>% promises::promise_map(\ (a) a+1) -> promise

(\ (promise) promise %>% 
    {.$then} %>% environment %>% 
    {while (.$private$state != "fulfilled") {
        
        message (.$private$state," ..."); Sys.sleep(1)
        }; .$private$value} %>% 
    
{.}) (promise)

如果您将这些代码提交到控制台一次,它将永远

prnding ...
;但如果你一个一个提交这些代码,它会返回结果。


-2
投票

你必须使用价值函数:

value(df_filtered_promise)
© www.soinside.com 2019 - 2024. All rights reserved.