Crie um nome de variável com “colar” em R?


87

Ver abaixo:

paste("perf.a", "1", sep="")
# [1] "perf.a1"

E se eu quiser atribuir um valor a perf.a1?

Eu tentei as.name, as.symboletc., sem sucesso:

as.name(paste("perf.a", "1", sep="")) = 5
# Error in as.name(paste("perf.a", "1", sep = "")) = 5 : 
#   target of assignment expands to non-language object
as.symbol(paste("perf.a", "1", sep="")) = 5
# Error in as.symbol(paste("perf.a", "1", sep = "")) = 5 : 
#   target of assignment expands to non-language object
noquote(paste("perf.a", "1", sep="")) = 5
# Error in noquote(paste("perf.a", "1", sep = "")) = 5 : 
#   target of assignment expands to non-language object


Respostas:


126

Você pode usar assign( doc ) para alterar o valor de perf.a1:

> assign(paste("perf.a", "1", sep=""),5)
> perf.a1
[1] 5

3
Por que isso foi tão difícil de encontrar!
lamecícula de

25
assign(paste0("perf.a", "1"), 5)é um pouco mais organizado
Louis Maddox


9

No meu caso, a função eval () funciona muito bem. Abaixo, eu gero 10 variáveis ​​e atribuo a elas 10 valores.

lhs <- rnorm(10)
rhs <- paste("perf.a", 1:10, "<-", lhs, sep="")
eval(parse(text=rhs))

Não utilizável se o RHS for complicado ou grande. Além disso, mesmo em casos simples, há alguma perda de precisão: normalmente a <- rnorm(1); a - eval(parse(text=paste(a)))não retorna 0.

3

No meu caso, os símbolos que criei (Tax1, Tax2, etc.) já tinham valores, mas eu queria usar um loop e atribuir os símbolos a outra variável. Portanto, as duas respostas acima me deram uma maneira de fazer isso. Isso pode ser útil para responder à sua pergunta, pois a atribuição de um valor pode ocorrer a qualquer momento posteriormente.

output=NULL
for(i in 1:8){
   Tax=eval(as.symbol(paste("Tax",i,sep="")))
   L_Data1=L_Data_all[which(L_Data_all$Taxon==Tax[1] | L_Data_all$Taxon==Tax[2] | L_Data_all$Taxon==Tax[3] | L_Data_all$Taxon==Tax[4] | L_Data_all$Taxon==Tax[5]),]
   L_Data=L_Data1$Length[which(L_Data1$Station==Plant[1] | L_Data1$Station==Plant[2])]
   h=hist(L_Data,breaks=breaks,plot=FALSE)
   output=cbind(output,h$counts)
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.