【问题标题】:Get value from R fullfilled promise从 R 实现的承诺中获取价值
【发布时间】:2019-07-25 00:07:45
【问题描述】:

我读了很多关于Rpromises(包括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"

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

【问题讨论】:

  • @r2evans 我不是问future 是如何工作的,而是promises
  • 抱歉,我以为他们已经够近了,但你说得对,我赶时间。
  • 代码对我不起作用:> read.csv.async df_promise rstudio.github.io/promises/data.csv") > df_promise %...>% filter(state == "NY") df_promise 中的错误 %...> % filter(state == "NY") : 找不到函数 "%...>%"
  • @DanielFischer 只需添加library(promises)
  • 我发现他们的documentation 有点不完整:例如,我可以执行df_promise %...&gt;% print(),它会打印出来,但我不想打印出来 ,我希望它实现/收集。我想知道promises 的意图是否真的不像shiny 那样具有用户交互性(它运作良好)。

标签: r asynchronous promise future


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • > “我建议你不要将 Promise 用于交互式或脚本用途,可能。” promises 的复杂性确实令人生畏,我没有选择在脚本中使用它来“取乐”。 RLesur/crrri 包依赖于 Promise,如果你想在脚本中提取 html 结果,你需要这样做 something 像这样(我来到这里是因为我迫切希望返回/收集我的 crri/在不使用超级/全局分配的情况下承诺 html 结果)。看来这是我们目前能做的最好的了。
【解决方案2】:

df

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

【讨论】:

  • 您好,欢迎来到 Stack Overflow!请拨打tour。感谢您的回答,但您是否还可以添加有关您的代码如何解决问题的解释?查看help center 获取有关如何格式化代码的信息。
【解决方案3】:

你必须使用价值函数:

value(df_filtered_promise)

【讨论】:

  • 否:&gt; future::value(df_filtered_promise) Error in UseMethod("value") : no applicable method for 'value' applied to an object of class "promise"
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
相关资源
最近更新 更多