R: нежелательные кавычки в tibble :: lst names - PullRequest
0 голосов
/ 18 сентября 2018

Я только недавно узнал о tibble::lst, который создает объект списка, но автоматически называет элементы списка.Я использую это как ярлык в рабочем процессе %>%, который использует имена в качестве аргумента .id в map_dfr, поэтому автоматическое именование действительно полезно.

Однако имена приходят с кавычками вокруг них.Я заметил это, потому что они неловко печатались на метках оси в ggplot, то есть у меня была этикетка с надписью "Hartford" вместо Hartford.

Я просматривал проблемы на tidyverse/tibble github, но ничего не нашел.Это ошибка, или я делаю что-то не так?

library(dplyr)
library(purrr)

cities <- lst("New Haven", "Bridgeport", "Hartford")
cities
#> $`"New Haven"`
#> [1] "New Haven"
#> 
#> $`"Bridgeport"`
#> [1] "Bridgeport"
#> 
#> $`"Hartford"`
#> [1] "Hartford"

cities %>%
  map_dfr(~tibble(dummy = rnorm(1)), .id = "city")
#> # A tibble: 3 x 2
#>   city               dummy
#>   <chr>              <dbl>
#> 1 "\"New Haven\""  -0.956 
#> 2 "\"Bridgeport\""  0.533 
#> 3 "\"Hartford\""   -0.0553

Сначала я подумал, что это может быть экранирование в «Нью-Хейвене», но это также происходит с отдельными символами:

lst("a", "b", "c")
#> $`"a"`
#> [1] "a"
#> 
#> $`"b"`
#> [1] "b"
#> 
#> $`"c"`
#> [1] "c"

Это работает так, как я ожидаю, когда я предоставляю имена, но это побеждает это преимущество, которое lst имеет над базой list.

lst(a = "a", b = "b", c = "c")
#> $a
#> [1] "a"
#> 
#> $b
#> [1] "b"
#> 
#> $c
#> [1] "c"

Я уверен, что я в курсена tidyverse связанных пакетах, но вот моя информация о сеансе на всякий случай:

sessionInfo()
#> R version 3.5.1 (2018-07-02)
#> Platform: x86_64-apple-darwin15.6.0 (64-bit)
#> Running under: macOS High Sierra 10.13.6
#> 
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
#> 
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] purrr_0.2.5 dplyr_0.7.6
#> 
#> loaded via a namespace (and not attached):
#>  [1] Rcpp_0.12.18     knitr_1.20       bindr_0.1.1      magrittr_1.5    
#>  [5] tidyselect_0.2.4 R6_2.2.2         rlang_0.2.2      fansi_0.3.0     
#>  [9] stringr_1.3.1    tools_3.5.1      utf8_1.1.4       cli_1.0.0       
#> [13] htmltools_0.3.6  yaml_2.2.0       assertthat_0.2.0 rprojroot_1.3-2 
#> [17] digest_0.6.16    tibble_1.4.2     crayon_1.3.4     bindrcpp_0.2.2  
#> [21] glue_1.3.0       evaluate_0.11    rmarkdown_1.10   stringi_1.2.4   
#> [25] compiler_3.5.1   pillar_1.3.0     backports_1.1.2  pkgconfig_2.0.2

1 Ответ

0 голосов
/ 18 сентября 2018

lst() действительно предназначен для использования с переменными.Например,

xa<-"a"
xb<-"b"
xc<-"c" 
lst(xa,xb,xc)
# $`xa`
# [1] "a"
# $xb
# [1] "b"
# $xc
# [1] "c"

. Не подходит для буквальных безымянных значений.Он берет имя элемента из недооцененного выражения, которое вы передаете. Поэтому, если вы передаете символьное значение, это оцененное выражение все еще содержит кавычки.Я думаю, вы просто хотите list() здесь.Возможно с именами:

cities <- list("New Haven", "Bridgeport", "Hartford") 
names(cities)<-unname(cities)
cities
# $`New Haven`
# [1] "New Haven"
# $Bridgeport
# [1] "Bridgeport"
# $Hartford
# [1] "Hartford"

или просто напишите свою собственную функцию

nlist <- function(...) {
    setNames(list(...), c(...))
}
cities <- nlist("New Haven", "Bridgeport", "Hartford") 
...