/ / Jak przypisać funkcję do zmiennej, której nazwa powinna zostać utworzona za pomocą funkcji wklejania? [duplikat] - r, eval

W jaki sposób przypisać funkcję do zmiennej, której nazwa powinna zostać utworzona za pomocą funkcji wklejania? [duplikat] - r, eval

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 № 1

To 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.