Como nomear variáveis ​​em tempo real?

96

É possível criar novos nomes de variáveis ​​em tempo real?

Eu gostaria de ler os quadros de dados de uma lista em novas variáveis ​​com números no final. Algo como orca1, orca2, orca3 ...

Se eu tentar algo como

paste("orca",i,sep="")=list_name[[i]]

Eu recebo este erro

target of assignment expands to non-language object

Existe outra maneira de contornar isso?

Maiasaura
fonte
10
Já que estamos distribuindo tags r-faq, vamos fornecer o link (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Respostas:

118

Use assign:

assign(paste("orca", i, sep = ""), list_name[[i]])
Shane
fonte
28
É assim que se faz isso. Há uma meta-pergunta aqui que é: "Devo fazer isso?" A resposta é quase sempre "não". Os elementos nomeados em uma lista quase sempre são preferidos.
Ari B. Friedman
26
A resposta é quase sempre "não", exceto quando não é.
Shane
9
Bem, claro. Mas a maioria das pessoas que buscam essa resposta não o faz por ter rejeitado uma lista para sua inscrição.
Ari B. Friedman
@Ari B. Friedman Eu gero nomes de variáveis ​​para conjuntos de dados que salvo em meu pacote / dados. Cada um em seu arquivo com o mesmo nome para o arquivo e os dados nele contidos (dadas as recomendações R para dados no pacote). Cada conjunto de dados tem cerca de 10 milhões e o total é de aproximadamente 17 anos. Dificilmente vejo outra maneira.
cmbarbu de
3
Existe algum motivo pelo qual você não usou paste0?
BroVic
33

Parece-me que você pode ser melhor fora com uma lista ao invés de usar orca1, orca2etc, ... então seria orca[1], orca[2]...

Normalmente, você está fazendo uma lista de variáveis ​​diferenciadas por nada além de um número, porque esse número seria uma maneira conveniente de acessá-las posteriormente.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

Caso contrário, assigné exatamente o que você deseja.

John
fonte
11
Concordo. Normalmente, quando as pessoas pensam que desejam nomear variáveis ​​imediatamente, o que realmente desejam é uma estrutura de dados diferente.
Michael Dunn
9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) discute isso muito bem
Ben Bolker
11

Não faça frames de dados. Guarde a lista, nomeie seus elementos, mas não a anexe.

A maior razão para isso é que se você criar variáveis ​​em movimento, quase sempre você terá que iterar mais tarde por cada uma delas para realizar algo útil. Lá você será novamente forçado a iterar em cada um dos nomes que criou instantaneamente.

É muito mais fácil nomear os elementos da lista e iterar por meio dos nomes.

No que diz respeito ao attach, é uma prática de programação muito ruim em R e pode levar a muitos problemas se você não for cuidadoso.

Sidquanto
fonte
Então, faça um attach, mas só depois de ter feito a iteração pela lista?
Mox de
4

FAQ diz:

Se você tem

varname <- c("a", "b", "d")

você pode fazer

get(varname[1]) + 2

para

a + 2

ou

assign(varname[1], 2 + 2)

para

a <- 2 + 2

Portanto, parece que você usa GET quando deseja avaliar uma fórmula que usa uma variável (como uma concatenação) e ASSIGN quando deseja atribuir um valor a uma variável pré-declarada.

Sintaxe para atribuir: atribuir (x, valor)

x: um nome de variável, fornecido como uma string de caracteres. Nenhuma coerção é feita, e o primeiro elemento de um vetor de caracteres de comprimento maior que um será usado, com um aviso.

valor: valor a ser atribuído a x.

Mox
fonte
0

Outra solução complicada é nomear os elementos da lista e attach:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
Marek
fonte
14
complicado, mas não sábio. se a resposta for, attachvocê geralmente está fazendo a pergunta errada ...
Ben Bolker
-1

E essa opção?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

Funciona perfeitamente. No exemplo que você colocou, a primeira linha está faltando e, em seguida, apresenta a mensagem de erro.

gla
fonte
3
Isso não responde à pergunta de OP. Temos uma lista com dataframes e queremos atribuí-la a dataframes, nomeados como orca1, orca2, etc.
zx8754
"Lista com dataframes" = "lista de dataframes"?
Mox