r - R - 在 plot_ly 中结合 tidy eval 和 tilde 时出错
问题描述
我无法理解以下代码返回错误的原因:
d <- tibble(a = 1:10, x = 1:10, y = 1:10)
f <- function(.data, expr) {
plot_ly(.data %>% filter({{ expr }}), x = ~x, y = ~y) %>% add_markers()
}
f(d, a <= 5)
# "Error in as.list.environment(x, all.names = TRUE) : object 'a' not found"
但这按预期运行:
g <- function(.data, expr) {
plot_ly(.data %>% filter({{ expr }})) %>% add_markers(x = ~x, y = ~y)
}
g(d, a <= 5)
似乎在同一个函数调用中使用 tidy eval 和 plot_ly 波浪号公式会导致 tidy eval 出现问题?我想了解为什么以防止将来出现错误。有没有办法在同一个函数调用中仍然使用它们?我找到了这个替代方案:
h <- function(.data, expr) {
rlang::eval_tidy(
rlang::quo_squash(quo({
plot_ly(.data %>% filter({{ expr }}), x = ~x, y = ~y) %>% add_markers()
}))
)
}
h(d, a <= 5)
但是我宁愿使用上面的第二种形式 g()
解决方案
您链接到的第二种形式没有多大意义,我会避免使用它。
如果我像这样重写你的函数,它似乎可以工作:
f <- function(.data, expr) {
.data %>%
filter({{ expr }}) %>%
plot_ly(
x = ~x,
y = ~y
) %>%
add_markers()
}
不知道为什么。
当我为您的帖子中的错误打印回溯时,我看到 plotly 仍在后台使用lazyeval,这是 tidy eval 的前身。这有点可疑,可能值得在 plotly repo 中提交一个错误。
推荐阅读
- javascript - 如何在电子表格列的单元格中迭代指向谷歌表单的链接以获取他们的问题?
- javascript - 退出Web应用程序时出现FirebaseError,用户回调抛出异常,文档引用必须有偶数个段
- rust - 如何在 Rust 中使用 Tera 创建数组?
- html - 容器流体填充在 css 中不起作用,并且导航栏品牌 css 不起作用
- regex - 在 Google Sheet 公式中使用 RegEx 提取多个值
- powershell - 为我的所有文件生成校验和哈希的 powershell 脚本在我的媒体文件夹中
- php - 通过 CSV 导出/导入 mysql json 对象
- java - 简单的 android studio 应用程序在我运行时崩溃。它没有错误
- c++ - 为什么 ADL 对运算符函数的行为与其他函数不同?
- c# - 具有不同方法签名的工厂方法