代码之家  ›  专栏  ›  技术社区  ›  camille

r:tibble::lst名称中不需要的引号

  •  1
  • camille  · 技术社区  · 6 年前

    我最近才知道 tibble::lst ,它创建一个列表对象,但自动命名列表项。我用这个作为 %>% 将名称用作 .id 论点 map_dfr 因此,自动命名非常有用。

    不过,这些名字周围都有引号。我注意到这一点是因为它们笨拙地打印在 ggplot 也就是说,我的标签上写着 "Hartford" 而不是 Hartford .

    我仔细研究了 tidyverse/tibble 但没找到任何东西。这是一个错误,还是我做错了什么?

    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 回复  |  直到 6 年前
        1
  •  5
  •   MrFlick    6 年前

    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")