从 R fullfilled promise 中获取价值
Get value from R fullfilled promise
我读了很多关于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"
为什么 fullfilled promise
没有 return 它的价值?在我的案例中如何提取数据框?
你必须使用价值函数:
value(df_filtered_promise)
有一种方法可以做到这一点,但在我告诉你之前,我建议你可能不要将 promise 用于交互或脚本用途。同步编程比异步编程更方便,只有在不占用主 R 线程非常重要的情况下才应该使用后者(如果你想让应用程序在长时间操作时保持响应,Shiny 就是这种情况 运行) .
如果您选择使用 future,请尽量避免在它之后链接任何 %...>%
操作,然后您可以像 Daniel Fischer 所说的那样简单地使用 future::value
。
如果您确实决定完全使用 promises,并且将值提取到常规变量中对您来说很重要,那么您可以通过副作用来实现这一点,例如这个超级赋值:
df_filtered <- NULL
df_filtered_promise %...>% { df_filtered <<- . }
这将导致 df_filtered
变量在将来的某个时间被设置为 df_filtered_promise
的结果。 (但在出错的情况下永远不会分配。)
这通常不应该在 Shiny 中完成,因为您通常希望将事情一直包裹在 promises 中直到计算结束,这样 Shiny 就可以跟踪 outputs/observers 正在等待什么操作.
df <- environment (promise_object[["then"]])[["private"]][["value"]] 就是你要找的。
Promise 对象以嵌套列表格式存储数据和属性,该列表是环境对象的一部分。
我读了很多关于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"
为什么 fullfilled promise
没有 return 它的价值?在我的案例中如何提取数据框?
你必须使用价值函数:
value(df_filtered_promise)
有一种方法可以做到这一点,但在我告诉你之前,我建议你可能不要将 promise 用于交互或脚本用途。同步编程比异步编程更方便,只有在不占用主 R 线程非常重要的情况下才应该使用后者(如果你想让应用程序在长时间操作时保持响应,Shiny 就是这种情况 运行) .
如果您选择使用 future,请尽量避免在它之后链接任何 %...>%
操作,然后您可以像 Daniel Fischer 所说的那样简单地使用 future::value
。
如果您确实决定完全使用 promises,并且将值提取到常规变量中对您来说很重要,那么您可以通过副作用来实现这一点,例如这个超级赋值:
df_filtered <- NULL
df_filtered_promise %...>% { df_filtered <<- . }
这将导致 df_filtered
变量在将来的某个时间被设置为 df_filtered_promise
的结果。 (但在出错的情况下永远不会分配。)
这通常不应该在 Shiny 中完成,因为您通常希望将事情一直包裹在 promises 中直到计算结束,这样 Shiny 就可以跟踪 outputs/observers 正在等待什么操作.
df <- environment (promise_object[["then"]])[["private"]][["value"]] 就是你要找的。
Promise 对象以嵌套列表格式存储数据和属性,该列表是环境对象的一部分。