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

塔兹

我阅读了许多有关R promises(包括this)的文章,但仍然听不懂。

看到代码:

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"

为什么完整填充 promise不返回其值?我该如何提取数据框?

Joe Cheng

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

如果您选择使用future,请尝试不要%...>%在其后链接任何操作,然后可以future::value按照Daniel Fischer所说的那样简单地使用

如果您确实决定完全使用Promise,并且将值提取到常规变量中对您而言很重要,那么您可以通过副作用来实现此目的,例如以下超级分配:

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

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

通常不应该在Shiny中完成此操作,因为您通常希望一直将承诺包裹在包中,直到计算结束,这样Shiny才能跟踪哪些输出/观察者在等待什么操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档