【问题标题】:Convert names of vector objects into the tags of the list of vectors with R用 R 将向量对象的名称转换为向量列表的标签
【发布时间】:2021-01-05 19:55:07
【问题描述】:

我有一些向量,像这样:

months <- c("january", "february", "march", "october", "december") 
weekdays <- c("Sunday", "Monday", "Tuesday")
seasons <- c("Summer", "Winter", "Fall", "autumn")

我想创建一个这样的列表

timeWords_list <- list(months,  weekdays, seasons)

有没有办法直接用向量对象的名字来标记列表的对象?

我想要的结果可以这样实现:

names(timeWords_list) <- c("months",  "weekdays", "seasons")

但是,有没有办法直接做到这一点?无需重写这些名称(在字符串向量中)?

【问题讨论】:

  • 如果您愿意,tibble::lst 会为您执行此操作。

标签: r list data-transform


【解决方案1】:

试试这些单线。第一个确实要求每个名称写两次,但不需要提供名称的字符向量,并且代码的意图非常明确。第二个只要求名字写一次。第三个根本不需要写出名称,但只有在没有其他名称以s 结尾的变量时才有效——如果有这样的名称,这些变量也将包含在列表中。

没有使用任何包。

L1 <- list(months = months, weekdays = weekdays, seasons = seasons)

L2 <- mget(c("months", "weekdays", "seasons"))

L3 <- mget(ls(pattern = "s$"))

【讨论】:

  • 我原以为第一个是“已知的”,但事后看来还是应该包括它,以防万一。我经常建议不要使用 get/assign 函数(当被滥用时),因为我在这样的合法用途中一直忘记它们。
【解决方案2】:

如果您已经在使用 tidyverse 中的软件包,那么 tibble::lst 已经这样做了:

tibble::lst(months,  weekdays, seasons)
# $months
# [1] "january"  "february" "march"    "october"  "december"
# $weekdays
# [1] "Sunday"  "Monday"  "Tuesday"
# $seasons
# [1] "Summer" "Winter" "Fall"   "autumn"

如果你不是,你可以自己烤,借用https://stackoverflow.com/a/55019843/3358272

mylist <- function(...) setNames(list(...), as.character(match.call(expand.dots = FALSE)$...))
mylist(months,  weekdays, seasons)
# $months
# [1] "january"  "february" "march"    "october"  "december"
# $weekdays
# [1] "Sunday"  "Monday"  "Tuesday"
# $seasons
# [1] "Summer" "Winter" "Fall"   "autumn"

但请注意,它并不总能如您所愿。

mylist(months,  weekdays, seasons, c(1,27,pi))
# $months
# [1] "january"  "february" "march"    "october"  "december"
# $weekdays
# [1] "Sunday"  "Monday"  "Tuesday"
# $seasons
# [1] "Summer" "Winter" "Fall"   "autumn"
# $`c(1, 27, pi)`
# [1]  1.000000 27.000000  3.141593

tibble::lst 做同样的事情(就像许多尝试这种诡计的函数一样),所以这不是一个新问题。

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2017-04-20
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2021-02-22
    • 2020-01-24
    相关资源
    最近更新 更多