1

在 R 中,我有一个包含命名元素和未命名元素的列表。我想遍历整个列表并应用一个函数,该函数只接受未命名元素的元素,并对命名元素的名称和附加元素应用不同的函数。

在伪代码中,函数看起来像if(named) f(name, list[[name]]) else g(element)list[[name]]使用该名称存储的元素在哪里。

例如,如果列表元素未命名,则返回该元素。如果列表元素被命名,那么我想返回重复次数等于元素的名称(假设元素是整数)。

如果我有,ll = list(a = 5, b = 3, 9, 18)那么该函数应该返回一个包含元素的列表

[[1]]
[1] "aaaaa"

[[2]]
[1] "bbb"

[[3]]
[1] 9

[[4]]
[1] 18

我考虑过迭代,names(ll)但这无法访问未命名的元素。两者names[[3]]names[[4]]等于""ll[[""]] = NULL

这个过程不需要非常有效,所以我可以使用

for(i in 1:length(names(ll)))
  if(names(ll)[[i]] == "")
    g(ll[[i]])
  else
    f(names(ll)[[i]], ll[[names(ll)[[i]])

但我正在寻找一个更整洁的解决方案。

4

2 回答 2

2
ll = list(a = 5, b = 3, 9, 18)

lapply(seq_along(ll), function(x){
         if(names(ll[x]) == ""){
            ll[[x]]
         }else{
            paste0(rep(names(ll[x]), times =ll[[x]]), collapse = '')
         }
            }
      )

[[1]]
[1] "aaaaa"

[[2]]
[1] "bbb"

[[3]]
[1] 9

[[4]]
[1] 18
于 2013-06-12T16:23:41.897 回答
1

You could make a little named function

named<-function(x) names(x)!=''

and then use it on your list:

ll <- list(a = 5, b = 3, 9, 18)
ll[named(ll)]
# $a
# [1] 5
# 
# $b
# [1] 3

Or the other way:

ll[!named(ll)]
# [[1]]
# [1] 9
# 
# [[2]]
# [1] 18 

But this will fail if you have no names on the list at all, so you could modify named to handle that case:

named<-function(x) if (is.null(names(x))) rep(FALSE,length(x)) else names(x)!=''
于 2013-06-12T16:20:03.773 回答