通过 sym 和 enquo 选择列范围 dplyr::select
selecting column ranges via sym and enquo with dplyr::select
BLUP:是否可以使用 sym
/enquo
将列 ranges 传递给 dplyr::select
?
考虑以下带有 A 到 E 列的标题:
library(tibble)
library(dplyr)
set.seed(4)
d = as_tibble(setNames(as.list(rnorm(5)), LETTERS[1:5]))
d
## # A tibble: 1 x 5
## A B C D E
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.217 -0.542 0.891 0.596 1.64
我可以使用列运算符 :
select 一系列列,例如
select(d, B:D)
## # A tibble: 1 x 3
## B C D
## <dbl> <dbl> <dbl>
## 1 -0.542 0.891 0.596
我什至可以通过这个范围:
cols = quo(B:D)
select(d, !!cols)
# same result as above
但我不能将它作为符号传递:
colsym = sym("B:D")
select(d, !!enquo(colsym))
## Error in .f(.x[[i]], ...) : object 'A:C' not found
当使用列范围 select 离子时,这是有问题的,例如在 R 包中。
在我的 real-world 示例中,我 select 设置了 20-40 列的多个范围,因此我想坚持使用 :
运算符而不是编写输出多个 20-40 元素向量并使用 enquos
(我认为这会起作用,但我还没有测试过)。
您正试图将非句法名称 B:D
作为符号传递——您需要的是一个表达式。您可以使用 rlang::parse_expr
将字符串转换为表达式:
cols <- rlang::parse_expr("B:D")
select(d, !!cols)
## A tibble: 1 x 3
# B C D
# <dbl> <dbl> <dbl>
#1 -0.542 0.891 0.596
BLUP:是否可以使用 sym
/enquo
将列 ranges 传递给 dplyr::select
?
考虑以下带有 A 到 E 列的标题:
library(tibble)
library(dplyr)
set.seed(4)
d = as_tibble(setNames(as.list(rnorm(5)), LETTERS[1:5]))
d
## # A tibble: 1 x 5
## A B C D E
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.217 -0.542 0.891 0.596 1.64
我可以使用列运算符 :
select 一系列列,例如
select(d, B:D)
## # A tibble: 1 x 3
## B C D
## <dbl> <dbl> <dbl>
## 1 -0.542 0.891 0.596
我什至可以通过这个范围:
cols = quo(B:D)
select(d, !!cols)
# same result as above
但我不能将它作为符号传递:
colsym = sym("B:D")
select(d, !!enquo(colsym))
## Error in .f(.x[[i]], ...) : object 'A:C' not found
当使用列范围 select 离子时,这是有问题的,例如在 R 包中。
在我的 real-world 示例中,我 select 设置了 20-40 列的多个范围,因此我想坚持使用 :
运算符而不是编写输出多个 20-40 元素向量并使用 enquos
(我认为这会起作用,但我还没有测试过)。
您正试图将非句法名称 B:D
作为符号传递——您需要的是一个表达式。您可以使用 rlang::parse_expr
将字符串转换为表达式:
cols <- rlang::parse_expr("B:D")
select(d, !!cols)
## A tibble: 1 x 3
# B C D
# <dbl> <dbl> <dbl>
#1 -0.542 0.891 0.596