使用基本 R 管道创建表达式/调用

Creating an expression/call using the base R pipe

提问人:nbenn 提问时间:9/10/2023 更新时间:9/10/2023 访问量:66

问:

有没有办法做以下事情

ex1 <- quote(iris)
ex2 <- quote(dplyr::filter(Species == "setosa" & Sepal.Width > 4))

substitute(x %>% y, list(x = ex1, y = ex2))
#> iris %>% filter(Species == "setosa" & Sepal.Width > 4)

使用基管而不是 Magrittr 管?

substitute(x |> y, list(x = ex1, y = ex2))
#> Error: The pipe operator requires a function call as RHS
R magrittr

评论


答:

8赞 jkd 9/10/2023 #1

错误消息在这里实际上非常有用。使用基础管道,您始终需要在右侧使用括号。所以做

substitute(x |> y(), list(x = ex1, y = ex2))
# (dplyr::filter(Species == "setosa" & Sepal.Width > 4))(iris)

确实会产生调用。但是,您可能希望更改调用以使其有效:ex2

ex1 <- quote(iris)
ex2 <- quote(\(x) dplyr::filter(x, Species == "setosa" & Sepal.Width > 4))

substitute(x |> y(), list(x = ex1, y = ex2)) |> eval()
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.7         4.4          1.5         0.4  setosa
# 2          5.2         4.1          1.5         0.1  setosa
# 3          5.5         4.2          1.4         0.2  setosa