- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 memoise
包将查询缓存到 arrow
数据集,但我有时会在哈希中遇到不匹配/“冲突”,因此会返回错误的值。
我已经隔离了问题并将其复制到下面的 MWE 中。问题在于,首先过滤然后汇总的箭头查询的 rlang::hash()
(memoise
使用)不依赖于过滤器。
我的问题是:这是我可以修复的东西吗(因为我错误地使用了它)或者这是其中一个包中的错误(我很乐意创建问题),如果是这样,是否应该将此报告给arrow
、rlang::hash()
,甚至 R6
?
例如,下面的所有三个查询都具有相同的哈希值,但它们应该不同(看看结果,结果显然是...)
library(arrow)
library(dplyr)
ds_file <- file.path(tempdir(), "mtcars")
write_dataset(mtcars, ds_file)
ds <- open_dataset(ds_file)
# 1) Create three different queries =======
# Query 1 with mpg > 25 ----
query1 <- ds |>
filter(mpg > 25) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg))
# Query 2 with mpg > 0 ----
query2 <- ds |>
filter(mpg > 0) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg))
# Query 3 with filter on cyl ----
query3 <- ds |>
filter(cyl == 4) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg))
# 2) Lets compare the hashes: the main issue ======
rlang::hash(query1)
#> [1] "f505339fd65df6ef53728fcc4b0e55f7"
rlang::hash(query2)
#> [1] "f505339fd65df6ef53728fcc4b0e55f7"
rlang::hash(query3)
#> [1] "f505339fd65df6ef53728fcc4b0e55f7"
# ERROR HERE: they should be different as the queries are different!
# 3) Lets also compare the results: clearly different =====
query1 |> collect()
#> # A tibble: 2 × 3
#> vs n mean_mpg
#> <dbl> <int> <dbl>
#> 1 1 5 30.9
#> 2 0 1 26
query2 |> collect()
#> # A tibble: 2 × 3
#> vs n mean_mpg
#> <dbl> <int> <dbl>
#> 1 0 18 16.6
#> 2 1 14 24.6
query3 |> collect()
#> # A tibble: 2 × 3
#> vs n mean_mpg
#> <dbl> <int> <dbl>
#> 1 1 10 26.7
#> 2 0 1 26
请注意,当我使用 digest
时会发生同样的错误。
当我打印查询时,它们被打印为好像它们是相同的...(我向箭头报告了这个错误 here)
query1
#> FileSystemDataset (query)
#> vs: double
#> n: int32
#> mean_mpg: double
#>
#> See $.data for the source Arrow object
query2
#> FileSystemDataset (query)
#> vs: double
#> n: int32
#> mean_mpg: double
#>
#> See $.data for the source Arrow object
query3
#> FileSystemDataset (query)
#> vs: double
#> n: int32
#> mean_mpg: double
#>
#> See $.data for the source Arrow object
但是当我查询查询的$.data
参数时,我发现它们实际上是不同的
query1$.data
#> FileSystemDataset (query)
#> mpg: double
#> vs: double
#>
#> * Aggregations:
#> n: sum(1)
#> mean_mpg: mean(mpg)
#> * Filter: (mpg > 25) #<=========
#> * Grouped by vs
#> See $.data for the source Arrow object
query2$.data
#> FileSystemDataset (query)
#> mpg: double
#> vs: double
#>
#> * Aggregations:
#> n: sum(1)
#> mean_mpg: mean(mpg)
#> * Filter: (mpg > 0) #<=========
#> * Grouped by vs
#> See $.data for the source Arrow object
query3$.data
#> FileSystemDataset (query)
#> mpg: double
#> vs: double
#>
#> * Aggregations:
#> n: sum(1)
#> mean_mpg: mean(mpg)
#> * Filter: (cyl == 4) #<=========
#> * Grouped by vs
#> See $.data for the source Arrow object
但是 rlang::hash()
还是找不到区别:
rlang::hash(query1$.data)
#> [1] "b7f743cd635f7dc06356b827a6974df8"
rlang::hash(query2$.data)
#> [1] "b7f743cd635f7dc06356b827a6974df8"
rlang::hash(query3$.data)
#> [1] "b7f743cd635f7dc06356b827a6974df8"
如果有帮助,查询对象是 R6
类 arrow_dplyr_query
的对象(另见其 source code in apache/arrow)
为了完整起见并正确看待问题,我使用以下内容来缓存结果,它应该返回不同的值(见上文)但实际上没有!
library(arrow)
library(memoise)
library(dplyr)
ds_file <- file.path(tempdir(), "mtcars")
write_dataset(mtcars, ds_file)
ds <- open_dataset(ds_file)
collect_cached <- memoise::memoise(dplyr::collect,
cache = cachem::cache_mem(logfile = stdout()))
# Query 1 with mpg > 25 ----
ds |>
filter(mpg > 25) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg)) |>
collect_cached()
#> [2022-11-25 09:16:28.586] cache_mem get: key "2edd901226498414056dcc54eaa49415"
#> [2022-11-25 09:16:28.586] cache_mem get: key "2edd901226498414056dcc54eaa49415" is missing
#> [2022-11-25 09:16:28.705] cache_mem set: key "2edd901226498414056dcc54eaa49415"
#> [2022-11-25 09:16:28.706] cache_mem prune
#> # A tibble: 2 × 3
#> vs n mean_mpg
#> <dbl> <int> <dbl>
#> 1 1 5 30.9
#> 2 0 1 26
# Query 2 with mpg > 0 ----
# this is wrongly matched to the first query and returns wrong results...
ds |>
filter(mpg > 0) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg)) |>
collect_cached()
#> [2022-11-25 09:16:28.820] cache_mem get: key "2edd901226498414056dcc54eaa49415"
#> [2022-11-25 09:16:28.820] cache_mem get: key "2edd901226498414056dcc54eaa49415" found #< ERROR HERE! as the hash is identical
#> # A tibble: 2 × 3
#> vs n mean_mpg
#> <dbl> <int> <dbl>
#> 1 1 5 30.9
#> 2 0 1 26
请注意,尽管查询不同(但它们的哈希值相同,因此出现了这个问题),但我们得到了相同的结果。
最佳答案
这很像 hack……但也许就足够了?通过捕获 show_query
的输出并将其用作 hash=
的参数,我能够找到足够独特的关于包含其过滤器组件的中间“查询” 备忘录
:
hashfun <- function(x) {
x$x <- capture.output(show_query(x$x))
rlang::hash(x)
}
collect_cached <- memoise::memoise(
dplyr::collect,
cache = cachem::cache_mem(logfile = stdout()),
hash = hashfun)
ds |>
filter(mpg > 25) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg)) |>
collect_cached()
# [2022-11-25 08:14:56.596] cache_mem get: key "e6184e282e05875139e8afd2a071f329"
# [2022-11-25 08:14:56.596] cache_mem get: key "e6184e282e05875139e8afd2a071f329" is missing
# [2022-11-25 08:14:56.616] cache_mem set: key "e6184e282e05875139e8afd2a071f329"
# [2022-11-25 08:14:56.616] cache_mem prune
# # A tibble: 2 x 3
# vs n mean_mpg
# <dbl> <int> <dbl>
# 1 1 5 30.9
# 2 0 1 26
#### different filter, should be a "miss"
ds |>
filter(mpg > 0) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg)) |>
collect_cached()
# [2022-11-25 08:15:06.745] cache_mem get: key "88312b31b29050ff029900f4dfc58a9f"
# [2022-11-25 08:15:06.745] cache_mem get: key "88312b31b29050ff029900f4dfc58a9f" is missing
# [2022-11-25 08:15:06.767] cache_mem set: key "88312b31b29050ff029900f4dfc58a9f"
# [2022-11-25 08:15:06.767] cache_mem prune
# # A tibble: 2 x 3
# vs n mean_mpg
# <dbl> <int> <dbl>
# 1 0 18 16.6
# 2 1 14 24.6
#### repeat of filter `mpg > 0`, should be a "hit"
ds |>
filter(mpg > 0) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg)) |>
collect_cached()
# . + >
# [2022-11-25 08:15:24.825] cache_mem get: key "88312b31b29050ff029900f4dfc58a9f"
# [2022-11-25 08:15:24.825] cache_mem get: key "88312b31b29050ff029900f4dfc58a9f" found
# # A tibble: 2 x 3
# vs n mean_mpg
# <dbl> <int> <dbl>
# 1 0 18 16.6
# 2 1 14 24.6
传递给 hashfun
的对象是一个列表,其中第一个参数似乎是校验和或某种盐(我们将忽略它),以及所有剩余的参数(命名或其他)由缓存函数的形式决定。在我们的例子中,由于我们正在缓存 collect
,它接受 x=
(我们看到)和 ...=
(我们不't):
debugonce(hashfun)
ds |>
filter(mpg > 0) |>
group_by(vs) |>
summarise(n = n(), mean_mpg = mean(mpg)) |>
collect_cached()
# debugging in: encl$`_hash`(c(encl$`_f_hash`, args, lapply(encl$`_additional`,
# function(x) eval(x[[2L]], environment(x)))))
# debug at #1: {
# x$x <- capture.output(show_query(x$x))
# rlang::hash(x)
# }
x
# [[1]]
# [1] "1e4b92a7ebe8b4bcb1afbd44c9a72a72"
#
# $x
# FileSystemDataset (query)
# vs: double
# n: int32
# mean_mpg: double
#
# See $.data for the source Arrow object
show_query(x$x)
# ExecPlan with 6 nodes:
# 5:SinkNode{}
# 4:ProjectNode{projection=[vs, n, mean_mpg]}
# 3:GroupByNode{keys=["vs"], aggregates=[
# hash_sum(n, {skip_nulls=true, min_count=1}),
# hash_mean(mean_mpg, {skip_nulls=false, min_count=0}),
# ]}
# 2:ProjectNode{projection=["n": 1, "mean_mpg": mpg, vs]}
# 1:FilterNode{filter=(mpg > 0)}
# 0:SourceNode{}
只是用 show_query(x$x)
的返回替换 x$x
似乎没有用,因为似乎只有
ed 形式,因此我选择了 rlang::hash
无法打印 capture.output
。
关于rlang::hash 无法区分箭头查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74570604/
我从文档中可以看到rlang::enquo()和rlang::quo()用于不同的上下文。因此,我使用了 rlang::enysm()最近在函数声明中(见下文)。然而,在另一个 SE 函数调用中,我收
我正在尝试编写一个有点复杂的自定义函数,因此为了简单起见,我创建了玩具示例。 假设我想编写一个函数 - 自动决定运行适当的函数:例如,t 检验或方差分析。 接受“带引号” 和不带引号 参数 所以我编写
当我建立像决策树、随机森林这样的机器学习分类模型时,我会遇到错误。更新程序包(标准程序包)
我再次对 rlang 的文档感到困惑和错误信息。我使用双刘海和三刘海尝试了 20 次不同的迭代,:= , quo , enquo , ensym ,以及所有其他名称不明确的 rlang 函数。 如果您
我使用 memoise 包将查询缓存到 arrow 数据集,但我有时会在哈希中遇到不匹配/“冲突”,因此会返回错误的值。 我已经隔离了问题并将其复制到下面的 MWE 中。问题在于,首先过滤然后汇总的箭
假设我想计算 mean , min和 max对于自定义函数中任意数量的组。 玩具数据如下所示: library(tidyverse) df % gather(Variable, Value, -c
我创建了一个函数来将函数名转换为字符串。版本 1 func_to_string1 运行良好,但版本 2 func_to_string2 不起作用。 func_to_string1 func_to_s
我正在编写一个函数,其中我提供一个变量名作为符号。在函数的不同步骤中,我想将变量名称用作字符串。根据文档,rlang::as_string“将符号转换为字符串。” 这是一个基本的例子。此函数返回带有标
我正在写一个包,我的一个函数生成了一个 ggplot。我只想导入 ggplot2 或 rlang(不依赖于它们)。经过一些尝试和错误后,我设法让它工作,但现在我不确定为什么它能工作。 所以我的问题是,
我正在编写一个使用 tidyverse 函数的包,即使用非标准评估,如 dplyr::filter例如: setMethod("filter_by_id", signature(x
是否可以使用 rlang 整洁评估运算符 {{在 lm 公式中? 我知道您可以使用双花括号来定义一个通用函数,例如: my_scatter <- function(df, xvar, yvar) {
假设我有一个函数 f,它接受一堆参数,以及一个可选的额外参数。 f <- function(..., extra) { arglst <- lapply(quos(...), get_expr
说我有一个嵌套列表 tmp rlang::flatten(tmp) $a [1] 1 [[2]] [[2]]$x [1] 1 [[2]]$y [1] "a" [[3]] [[3]]$z [1] 2
文档表明这是可能的: fn % base::as.list() tmp %>% stringr::str_detect('x') %>%
我正在尝试创建一个字符串,其中包含“大括号”和用户基于的对象。然后我将在 ggplot 命令中解析和评估这个表达式。 test_func % rlang::expr() df %>%
有时,在使用 dplyr 时,会有一个列名称的字符向量,用于对数据进行操作,例如: cols_of_interest % select_(.dots = my_cols) 现在已弃用 verb_
我希望有人能帮助我解决我的代码的问题。我花了大约 5 个小时试图找出代码的问题,并检查了这些链接 1 , 2但无法找出我的代码的问题我正在尝试构建一个 Shiny 的应用程序,但是当我运行代码时,我不
我正在构建一个函数,我希望用户能够为其传递未加引号的变量。稍后,在准备输出时,我将需要这些变量的名称作为字符串。 如果每个参数只携带一个变量,这没有问题。我可以使用 deparse(substitut
我正在尝试安装 tidyr 的开发版本。当我尝试 devtools::install_github("tidyverse/tidyr") 或 remotes::install_github("tidy
我希望有人能帮助我解决我的代码的问题。我花了大约 5 个小时试图找出代码的问题,并检查了这些链接 1 , 2但无法找出我的代码的问题我正在尝试构建一个 Shiny 的应用程序,但是当我运行代码时,我不
我是一名优秀的程序员,十分优秀!