r - 从 R 实现的承诺中获取价值
问题描述
我读了很多关于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"
为什么fullfill promise
不返回它的值?在我的情况下如何提取数据框?
解决方案
有一种方法可以做到这一点,但在我告诉你之前,我建议你不要将 Promise 用于交互或脚本用途。同步编程比异步编程更方便,只有在不占用主 R 线程非常重要的情况下才应该使用后者(如果您希望在长时间操作运行时保持应用程序响应,那么 Shiny 就是这种情况)。
如果您选择使用未来,请尽量避免在其后链接任何%...>%
操作,然后您可以future::value
像 Daniel Fischer 所说的那样简单地使用。
如果您决定完全使用 Promise,并且将值提取到常规变量中对您很重要,那么您可以通过副作用来完成此操作,例如这个超级赋值:
df_filtered <- NULL
df_filtered_promise %...>% { df_filtered <<- . }
这将导致df_filtered
变量设置为df_filtered_promise
将来某个时间点的结果。(不过,在出错的情况下永远不会分配它。)
这通常不应该在 Shiny 中完成,因为您通常希望将事情一直包裹在 Promise 中直到计算结束,这样 Shiny 可以跟踪哪些输出/观察者正在等待哪些操作。
推荐阅读
- firebase - 在 React Native 中将 Touch ID 与 Firebase Auth 集成
- c++ - 验证指针链
- php - 隐藏 Profile.php 上的参数并在页面上启用斜杠
- java - JUnit - 比较对象数组
- java - 使用 iText 5 或 7 将图像层添加到 pdf
- php - 无法在 oracle oci8 和 xampp php 上设置配置
- mysql - MSQL 如何在 NOT IN 中使用许多语句
- sql - 动态透视行到列-SQL 服务器
- r - 在 data.frames 上进行 rbind,其中包含.. 2d“asis”对象
- nwjs - 如何显示 nwjs 应用程序的进程管理器?