gpt4 book ai didi

r - 从 R 实现的 promise 中获取值(value)

转载 作者:行者123 更新时间:2023-12-04 01:04:56 26 4
gpt4 key购买 nike

我看了很多关于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不返回它的值?在我的情况下如何提取数据框?

最佳答案

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

如果您选择使用 future,请尽量避免链接任何 %...>%之后的操作,然后你就可以简单地使用 future::value正如丹尼尔·费舍尔所说。

如果您确实决定完全使用 promise,并且将值提取到常规变量中对您很重要,那么您可以通过副作用来实现这一点,就像这样的 super 赋值:

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

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

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

关于r - 从 R 实现的 promise 中获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com