我想知道如何从R中的列表对象遍历键/值对,如下面的示例:
toto <- list(a="my name is",b="I'm called",c="name:")
myfun <- function(key,value) paste(value,key)
for( key in names(toto) ) toto[key] <- myfun(key,toto[[key]])
有没有一种方法可以避免for循环(使用lapply()等)。会更快吗?
谢谢!
最佳答案
最好的解决方案是简单地直接调用paste
而不使用循环(已将其向量化):
> paste(toto, names(toto))
[1] "my name is a" "I'm called b" "name: c"
一个类似的问题previously asked on R-Help,其中包含一些创造性的解决方案。
lapply
无法显示函数中的名称。此功能由Romain Francois根据Thomas Lumley提供的内容提供:yapply <- function(X,FUN, ...) {
index <- seq(length.out=length(X))
namesX <- names(X)
if(is.null(namesX))
namesX <- rep(NA,length(X))
FUN <- match.fun(FUN)
fnames <- names(formals(FUN))
if( ! "INDEX" %in% fnames ){
formals(FUN) <- append( formals(FUN), alist(INDEX=) )
}
if( ! "NAMES" %in% fnames ){
formals(FUN) <- append( formals(FUN), alist(NAMES=) )
}
mapply(FUN,X,INDEX=index, NAMES=namesX,MoreArgs=list(...))
}
这是用法示例:
> yapply(toto, function( x ) paste(x, NAMES) )
a b c
"my name is a" "I'm called b" "name: c"
关于r - 从list()遍历键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500106/