在R中,我有一个包含命名元素和未命名元素的列表。我想迭代整个列表并应用一个函数,该函数只接受未命名元素的元素,并对命名元素的名称和附加元素应用不同的函数。
在伪代码中,该函数看起来像if(named) f(name, list[[name]]) else g(element)
,其中list[[name]]
是使用该名称存储的元素。
例如,如果list元素未命名,则返回该元素。如果list元素被命名,那么我想返回重复多次等于元素的名称(假设元素是一个整数)。
如果我有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]])
但我正在寻找一个更整洁的解决方案。
答案 0 :(得分: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
答案 1 :(得分:1)
你可以做一个小名字的功能
named<-function(x) names(x)!=''
然后在列表中使用它:
ll <- list(a = 5, b = 3, 9, 18)
ll[named(ll)]
# $a
# [1] 5
#
# $b
# [1] 3
或者另一种方式:
ll[!named(ll)]
# [[1]]
# [1] 9
#
# [[2]]
# [1] 18
但如果列表上根本没有名字,这将失败,因此你可以修改named
来处理这种情况:
named<-function(x) if (is.null(names(x))) rep(FALSE,length(x)) else names(x)!=''