'Error when extracting column indices with dplyr and conditional pipe operator evaluation
The following two operations should lead both to the indices of all numeric variables of the mtcars dataset. Nevertheless, the operation which uses the conditional evaluation of the pipe operator for the dataset produces an error. Can anyone explain why?
MWE :
data(mtcars)
require(dplyr)
require(stringr)
mtcars %>% {grep(pattern = . %>% select_if(.predicate = is.numeric ) %>%
colnames %>%
str_flatten('|'),x = colnames(.))}
Output :
Error in as.vector(x, "character") : cannot coerce type 'closure' to vector of type 'character'
data(mtcars)
require(dplyr)
require(stringr)
grep(pattern = mtcars %>% select_if(.predicate = is.numeric ) %>%
colnames %>%
str_flatten('|'),x = colnames(mtcars))
Delivers the expected output : [1] 1 2 3 4 5 6 7 8 9 10 11
Session info
> sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)
Matrix products: default
locale:
[1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252 LC_MONETARY=German_Germany.1252 LC_NUMERIC=C LC_TIME=German_Germany.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] stringr_1.4.0 dplyr_1.0.7
loaded via a namespace (and not attached):
[1] Rcpp_1.0.7 rstudioapi_0.13 magrittr_2.0.1 tidyselect_1.1.1 munsell_0.5.0 colorspace_1.4-1 R6_2.5.1 rlang_0.4.11.9001 fansi_0.5.0 tools_4.0.5 grid_4.0.5
[12] gtable_0.3.0 GauPro_0.2.4 utf8_1.2.2 cli_3.0.1 DBI_1.1.0 ellipsis_0.3.2 assertthat_0.2.1 tibble_3.1.5 lifecycle_1.0.1 crayon_1.4.1 purrr_0.3.4
[23] ggplot2_3.3.5 vctrs_0.3.8 rpart_4.1-15 glue_1.4.2 stringi_1.4.6 compiler_4.0.5 pillar_1.6.4 generics_0.1.0 scales_1.1.1 pkgconfig_2.0.3
Solution 1:[1]
We may use the pipe with where in select as _if/_at are deprecated
library(dplyr)
library(stringr)
mtcars %>%
select(where(is.numeric)) %>%
names %>%
str_flatten('|') %>%
grep(x = colnames(mtcars))
-output
[1] 1 2 3 4 5 6 7 8 9 10 11
As we are using stringr, str_which would give the same index output as grep
mtcars %>%
select(where(is.numeric)) %>%
names %>%
str_flatten('|') %>%
str_which(string = names(mtcars))
-output
[1] 1 2 3 4 5 6 7 8 9 10 11
In the OP's code, the . can be wrapped within {}
mtcars %>%
{grep(pattern = {.} %>%
select_if(.predicate = is.numeric ) %>%
colnames %>%
str_flatten('|'),x = colnames(.))
}
-output
[1] 1 2 3 4 5 6 7 8 9 10 11
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
