Rで「貼り付け」を使用して変数名を作成しますか?


87

下記参照:

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

に値を割り当てたい場合はどうなりperf.a1ますか?

、などを試しましたがas.nameas.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


回答:


126

assigndoc)を使用して、perf.a1の値を変更できます。

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

3
なぜこれを見つけるのがとても難しいのですか?
lamecicle 2014年

25
assign(paste0("perf.a", "1"), 5)少しすっきりしています
Louis Maddox


9

私の場合、関数eval()は非常にうまく機能します。以下では、10個の変数を生成し、それらに10個の値を割り当てます。

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

RHSが複雑または大きい場合は使用できません。さらに、単純な場合でも、精度がいくらか失われます。通常a <- rnorm(1); a - eval(parse(text=paste(a)))は戻りません0

3

私の場合、作成したシンボル(Tax1、Tax2など)にはすでに値がありますが、ループを使用してシンボルを別の変数に割り当てたいと思いました。したがって、上記の2つの答えは、これを達成する方法を私に与えました。値の割り当ては後でいつでも実行できるため、これは質問への回答に役立つ場合があります。

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)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.