Pertanyaan: Mengapa fungsi colnames menghasilkan tibble, bila digunakan dengan operator pipa %>% dan pemilih [?

Contoh: Diberikan judul berikut:

library(tidyverse)

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

Masalah: Fungsi colnames menghasilkan tibbe, bila digunakan dengan operator pipa dan pemilih [:

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

Padahal saya berharap itu menghasilkan vektor, seolah-olah tidak ada operator pipa yang digunakan:

colnames(x)[1]
#> [1] "a"
3
thando 29 Desember 2020, 00:13

2 jawaban

Jawaban Terbaik

Karena %>% auto-inserts . sebagai parameter pertama sisi kanan, kecuali . sudah digunakan sebagai parameter tingkat atas sisi kanan< /em>.

Sisi kanan Anda adalah colnames(.)[1] — dan . bukan parameter tingkat atas di sini. Faktanya, ekspresi colnames(.)[1] persis sama dengan

`[`(colnames(.), 1)

Jadi parameter tingkat atas dari ekspresi ini adalah colnames(.) dan 1. Tidak juga .. Jadi %>% ubah ekspresi Anda menjadi

`[`(x, colnames(x), 1)

Yang sekali lagi setara dengan

x[colnames(x), 1]

Dan ekspresi itu tidak benar-benar masuk akal, dan kebetulan menghasilkan apa yang Anda amati.

Untuk menghindari penyisipan otomatis ., Anda dapat membungkus ekspresi menjadi {…} seperti yang ditunjukkan oleh akrun. Atau Anda dapat membagi ekspresi majemuk menjadi bagian-bagian penyusunnya:

x %>% colnames() %>% `[`(1L)
5
Konrad Rudolph 28 Desember 2020, 21:29

Kita bisa menggunakan first setelah colnames

x %>% 
   colnames %>% 
   first
#[1] "a"

Atau blokir seluruh ekspresi dalam {} untuk dievaluasi sebagai ekspresi tunggal dan untuk menghindari prioritas operator

x %>%
    {colnames(.)[1]}
#[1] "a"
3
akrun 28 Desember 2020, 21:14