Итерация по паре ключ / значение из списка () - PullRequest
16 голосов
/ 21 декабря 2010

Я хотел бы знать, как я могу перебрать пару ключ / значение из объекта списка в 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 () или тому подобное). Будет ли это быстрее?

Спасибо!

Ответы [ 2 ]

15 голосов
/ 21 декабря 2010

Лучшее решение из всех - просто позвонить paste напрямую без цикла (он уже векторизован):

> paste(toto, names(toto))
[1] "my name is a" "I'm called b" "name: c"  

Аналогичный вопрос , ранее заданный в R-Help ,с несколькими творческими решениями.lapply не может отображать имена внутри функции.Эта функция была предоставлена ​​Романом Франсуа на основе чего-то Томаса Ламли:

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" 
6 голосов
/ 21 декабря 2010

Это должно сделать это для вас:

do.call(paste, list(toto, names(toto) ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...