Создать имя переменной с «вставить» в R? - PullRequest
72 голосов
/ 01 апреля 2011

См. Ниже:

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

Что если я хочу присвоить значение perf.a1?

Я пытался as.name, as.symbol и т. Д., Но безуспешно:

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

Ответы [ 4 ]

107 голосов
/ 01 апреля 2011

Вы можете использовать assign ( doc ), чтобы изменить значение perf.a1:

> assign(paste("perf.a", "1", sep=""),5)
> perf.a1
[1] 5
15 голосов
/ 01 апреля 2011

См. ?assign.

> assign(paste("tra.", 1, sep = ""), 5)
> tra.1
  [1] 5
8 голосов
/ 13 августа 2015

В моем случае функция eval () работает очень хорошо. Ниже я генерирую 10 переменных и присваиваю им 10 значений.

lhs <- rnorm(10)
rhs <- paste("perf.a", 1:10, "<-", lhs, sep="")
eval(parse(text=rhs))
2 голосов
/ 05 октября 2015

В моем случае символы, которые я создаю (Tax1, Tax2 и т. Д.), Уже имеют значения, но я хотел использовать цикл и назначить символы другой переменной.Таким образом, два приведенных выше ответа дали мне возможность сделать это.Это может быть полезно при ответе на ваш вопрос, поскольку присвоение значения может произойти в любое время позже.

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...