我有一些向量,像这样:
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")
但是,有没有办法直接做到这一点?无需重写这些名称(在字符串向量中)?
答案 0 :(得分:4)
尝试这些单线中的任何一种。第一个确实要求每个名字写两次,但不需要提供名字的字符向量,代码的意图非常明确。第二个只要求名字写一次。第三个根本不需要写出名称,但只有在没有其他名称以 s
结尾的变量时才有效——如果有这样的名称,这些变量也将包含在列表中。
没有使用任何包。
L1 <- list(months = months, weekdays = weekdays, seasons = seasons)
L2 <- mget(c("months", "weekdays", "seasons"))
L3 <- mget(ls(pattern = "s$"))
答案 1 :(得分: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
做同样的事情(就像许多尝试这种诡计的函数一样),所以这不是一个新问题。