- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有两个函数,我想将 a
嵌套在 b
中:
library(dplyr)
library(rlang)
a <- function(var, values){
filter(iris, {{var}} %in% values)
}
a(Species, "virginica") %>% head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 6.3 3.3 6.0 2.5 virginica
2 5.8 2.7 5.1 1.9 virginica
3 7.1 3.0 5.9 2.1 virginica
4 6.3 2.9 5.6 1.8 virginica
5 6.5 3.0 5.8 2.2 virginica
6 7.6 3.0 6.6 2.1 virginica
b
调用 a
,但使用 dot-dot-dot ...
做一些其他事情。它有一个传递给 a
的列表参数:
b <- function(l, ...){
eval_tidy(expr(a(!!! l)))
}
b(l = list(var = quo(Species), values = "virginica")) %>% head() # works if user passes quosure
当某些元素需要引用时,我可以将参数列表传递给 b
以在 a
中进行评估吗?所以对 b
的调用将如下所示:
b(l = list(var = Species, values = "virginica")) # does not work
我已经尝试了以下方法,但似乎我需要再拆分拼接一次或做些什么:
b <- function(l, ...){
l <- enquos(l)
qq_show(a(!!! l))
}
b(l = list(var = Species, values = "virginica"))
# a(^list(var = Species, values = "virginica"))
其他尝试会导致对 Species
的过早评估,从而导致错误:未找到对象“Species”
。
最佳答案
创建一个辅助函数,为 a()
收集参数。此助手可以使用 enquo()
化解 var
,因此用户不必使用 quo()
。
a <- function(var, values) {
filter(iris, {{ var }} %in% values)
}
a_opts <- function(var, values) {
list(var = enquo(var), values = values)
}
然后 b()
期望用户传递一个可能由 a_opts()
创建的参数列表。但是我们如何将这些参数传递给 a()
呢?我们不能直接使用 !!!
因为拼接仅在 ...
中启用(参见 dynamic dots )而 a()
没有采取 ...
。
一种解决方案是使用do.call()
。 rlang 惯用的另一个解决方案是使用 inject()
显式启用 !!!
:
b <- function(l) {
inject(a(!!!l))
}
示例用法:
a_opts(Species, "virginica") %>%
b() %>%
head()
关于r - Tidyeval:如何在没有用户引用的情况下将带有引用元素的列表传递给嵌套函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69636463/
假设我有两个函数,我想将 a 嵌套在 b 中: library(dplyr) library(rlang) a % head() Sepal.Length Sepal.Width Petal.Le
我想使用 dplyr >= 0.7 删除列向量 library(dplyr) data(mtcars) rem_cols % select(-one_of(rem_cols)) 关于以
我正在尝试创建一个将列名称列表传递给 dplyr 函数的函数。如果列名称列表以 ... 形式给出,我知道如何执行此操作,如 tidyeval 文档中所述: df % group_by(!!!g
我正在尝试创建一个将列名称列表传递给 dplyr 函数的函数。如果列名称列表以 ... 形式给出,我知道如何执行此操作,如 tidyeval 文档中所述: df % group_by(!!!g
我有一个 tibble 列 foo 包含 tibble 中另一列的名称。我想根据 foo 中命名的列进行过滤: mtcars %>% mutate(foo = c(rep("carb", 16),
我在 R 中有一个简单的函数,... 使用 tidyeval。是否可以将这些更改为字符串? simple_paste % paste(collapse="_x_") } si
如果我想明确覆盖范围,我可以使用 .data像这样的代词 library(dplyr) cyl # A tibble: 32 x 1 #> cyl_plus_one #>
我正在尝试包装 dplyr::filter在一个函数中,当有多个时 filter条件,然后它们作为向量或列表传递。请参阅此最小示例: filter_wrap 5) obtained 5) stop
与Tidy evaluation programming with dplyr::case_when有些相关和 Making tidyeval function inside case_when ,我
我正在使用 tidyeval 编写一个简单的函数,我需要将参数传递给公式接口(interface)。虽然我已经设法构建了该函数的工作版本,但它似乎不适用于 for 循环。 函数 foo Bayes
我正在尝试使用 tidyeval 进行编程。 我想编写一个函数来为选定的结果变量运行逻辑回归模型: library(tidyverse) set.seed(1234) df 如果我们还需要使用tid
考虑这个简单的例子 library(dplyr) dataframe dataframe # A tibble: 4 x 3 id group value 1 1
最新版本的 dplyr 不推荐使用下划线版本的函数,例如 filter_,转而使用 tidy evaluation . 新方式下划线形式的新形式是什么?如何使用 R CMD 检查来避免 undefin
我们可以定义一个使用动态列名的函数,然后在map中使用它。请注意 ListCol 中的 tibbles 如何具有列名称 a 和 b(取自原始文件中的 Letter 列)蒂 bool 。 library
接上较早的话题,( Use string as filter in dplyr? ),新的 tidyeval 会是什么?对此的回答是,因为 filter_ 已被弃用。 有没有办法在 dplyr 中使用
library(tidyverse) set.seed(1) graph.data 1 2009-10-14 4.87 2 2009-10-15 8.
所以这个例子基本上来自https://tidyeval.tidyverse.org/dplyr.html#patterns-for-single-arguments它工作得很好: library(ti
对于造成的困惑,我深表歉意,但最终,我发布的第一个示例(在页面底部)并没有帮助我弄清楚 tidyeval 如何与 mutate 一起工作,所以我添加了一个新示例。 我想创建一个接受三个参数的函数: 一
这个问题在这里已经有了答案: How to take in text/character argument without quotes (2 个答案) 关闭 7 个月前。 我写了一个函数。在我的函
library(tidyverse) input_name expr: ^filter(data, "birth_year" == 19) env: global 第 6 行 exp
我是一名优秀的程序员,十分优秀!