首页 > 解决方案 > 为什么 colnames 函数与管道运算符和 [ 选择器一起使用时会生成 tibble(而不是向量)?

问题描述

问题:为什么该colnames函数与管道运算符%>%[选择器一起使用时会生成一个小标题?

示例:给定以下小标题:

library(tidyverse)

x <- tribble(
  ~a, ~b,
  1, 0,
  0, 1
)

问题:当与管道运算符和[选择器一起使用时,colnames 函数会生成一个 tibbe:

x %>% colnames(.)[1]
#> # A tibble: 2 x 1
#>       a
#>   <dbl>
#> 1    NA
#> 2    NA

而我希望它生成一个向量,就好像没有使用管道运算符一样:

colnames(x)[1]
#> [1] "a"

标签: rtidyversemagrittr

解决方案


管道将左侧插入到右侧主函数的第一个参数中,在本例中为 [ 。那就是这三个是相同的:

x %>% colnames(.)[1]

x %>% `[`(colnames(.), 1)

x %>% `[`(., colnames(.), 1)

最后一个是相同的,因为如果主函数的参数之一是点,它不会插入左侧。

为了防止它插入点使用 {...}

x %>% { colnames(.)[1] }

或使用:

x %>% colnames %>% .[1]

或使用dplyr::firstdplyr::slice_head(n = 1) 或 dplyr::nth(1) 或purrr::pull(1)magrittr::extract(1)head(1)

x %>% colnames %>% first

推荐阅读