【发布时间】:2021-03-22 06:00:50
【问题描述】:
只是尝试使用函数和中缀,我试图创建一个符号来表示dplyr::everything。
以下是一个示例,但我也尝试使用特殊字符,例如 @ 和 >>。
library(tidyverse)
data(mtcars)
mtcars %>%
as_tibble(rownames = "cars") -> mtcars
`%aa%` <<- function(vars=NULL) dplyr::everything(vars=NULL)
mtcars %>%
select(carb, everything)
#> Error: Can't subset columns that don't exist.
#> x Column `everything` doesn't exist.
mtcars %>%
select(carb, everything())
#> # A tibble: 32 x 12
#> carb cars mpg cyl disp hp drat wt qsec vs am gear
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 4 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4
#> 2 4 Mazda RX4 … 21 6 160 110 3.9 2.88 17.0 0 1 4
#> 3 1 Datsun 710 22.8 4 108 93 3.85 2.32 18.6 1 1 4
#> 4 1 Hornet 4 D… 21.4 6 258 110 3.08 3.22 19.4 1 0 3
#> 5 2 Hornet Spo… 18.7 8 360 175 3.15 3.44 17.0 0 0 3
#> 6 1 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3
#> 7 4 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3
#> 8 2 Merc 240D 24.4 4 147. 62 3.69 3.19 20 1 0 4
#> 9 2 Merc 230 22.8 4 141. 95 3.92 3.15 22.9 1 0 4
#> 10 4 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0 4
#> # … with 22 more rows
没用,reprex 不允许我渲染 ir,但这是另一个问题
# mtcars %>%
# select(carb, %aa% )
#
# mtcars %>%
# select(carb, %aa%() )
当然这效果更好,或者没有
mtcars %>%
select(carb, `%aa%` )
#> Error: Can't subset columns that don't exist.
#> x Column `%aa%` doesn't exist.
mtcars %>%
select(carb, `%aa%`() )
#> # A tibble: 32 x 12
#> carb cars mpg cyl disp hp drat wt qsec vs am gear
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 4 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4
#> 2 4 Mazda RX4 … 21 6 160 110 3.9 2.88 17.0 0 1 4
#> 3 1 Datsun 710 22.8 4 108 93 3.85 2.32 18.6 1 1 4
#> 4 1 Hornet 4 D… 21.4 6 258 110 3.08 3.22 19.4 1 0 3
#> 5 2 Hornet Spo… 18.7 8 360 175 3.15 3.44 17.0 0 0 3
#> 6 1 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3
#> 7 4 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3
#> 8 2 Merc 240D 24.4 4 147. 62 3.69 3.19 20 1 0 4
#> 9 2 Merc 230 22.8 4 141. 95 3.92 3.15 22.9 1 0 4
#> 10 4 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0 4
#> # … with 22 more rows
由reprex package (v0.3.0) 于 2020 年 12 月 10 日创建
这是不可能的,还是我做错了什么?
提前致谢。
【问题讨论】:
-
中缀运算符,即模式
%foo%的名称,用于二元运算。内置了一些特殊的,如+、-、==等,并且允许用户使用名称模式%name%定义它们。它们是带有两个参数的二元运算符,因此x %name% y被解释为`%name%`(x, y)。 -
你可能可以
everything,但是如果你想调用一个函数,你需要在它后面加上括号,或者在二进制中缀运算符的情况下,形式为@987654337 @。我不认为您将能够使用没有()的任何别名everything()。据我所知,唯一的例外是像+、-和!这样的原始函数以及像[、[[、@和$这样的语法。 -
这到底有什么意义?用
()来调用函数似乎还不错。
标签: r dplyr special-characters rlang infix-notation