Możliwe duplikaty:
Jak nazwać zmienne w locie w R?
Mam 10 obiektów typu lista o nazwie: list1
, list2
, ..., list10
. I chciałem użyć wyjścia z mojej funkcji FUN
do zastąpić pierwszy indeks tych zmiennych listy przez a for
loop:
for (i in 1:10){
eval(parse(test=(paste("list",i,sep=""))))[[1]] <- FUN()
}
ale to nie działa. Użyłem również lapply
w ten sposób i znowu jest źle:
lapply(eval(parse(text=(paste("list",i,sep=""))))[[1]], FUN)
Każda opinia byłaby doceniona.
Odpowiedzi:
4 dla odpowiedzi № 1To jest FAQ 7.21. Najważniejszą częścią tego FAQ jest ostatnia część, która mówi, aby nie robić tego w ten sposób, ale umieścić wszystko na liście i działać na liście.
Możesz umieścić swoje obiekty na liście używając kodu takiego jak:
mylists <- lapply( 1:10, function(i) get( paste0("list",i) ) )
Następnie możesz zastąpić go kodem:
mylists <- lapply( mylists, function(x) { x[[1]] <- FUN()
x} )
Teraz, jeśli chcesz zapisać wszystkie listy lub usunąćwszystkie listy, masz tylko jeden obiekt, z którym musisz pracować, zamiast zapętlać ponownie nazwy. Jeśli chcesz zrobić coś innego na każdej liście, po prostu użyj lapply lub sapply na ogólnej liście w jednym prostym kroku, nie martwiąc się o pętli. Możesz nazwać elementy listy, aby pasowały do oryginalnych nazw, jeśli chcesz i uzyskać do nich dostęp w ten sposób. Utrzymanie wszystkiego, co jest przedmiotem zainteresowania na jednej liście, spowoduje również, że twój kod będzie bezpieczniejszy, znacznie mniej prawdopodobne, aby przypadkowo nadpisał lub skasował inny obiekt.
2 dla odpowiedzi nr 2
Prawdopodobnie chcesz coś takiego
for (i in 1:10) {
nam <- paste0("list", i) ## built the name of the object
tmp <- get(nam) ## fetch the list by name, store in tmp
tmp[[1]] <- FUN() ## alter 1st component of tmp using FUN()
assign(nam, value = tmp) ## assign tmp back to the current list
}
jako pętla.