สร้างรายการชื่อตัวแปรในการวนรอบจากนั้นกำหนดค่าให้กับพวกเขา


27

ฉันสงสัยว่ามีวิธีง่ายๆในการสร้างรายการของตัวแปรที่ใช้สำหรับการวนรอบและให้ค่าของมัน

for(i in 1:3)
{
  noquote(paste("a",i,sep=""))=i
}

ในโค้ดข้างต้นที่ผมพยายามที่จะสร้างa1, a2, a3ซึ่งกำหนดให้เป็นค่าของ 1, 2, 3 อย่างไรก็ตาม R ให้ข้อความแสดงข้อผิดพลาด ขอบคุณสำหรับความช่วยเหลือของคุณ.


3
ฉันสงสัยว่าคุณต้องทำสิ่งนี้ - ดูเหมือนว่าคุณกำลังทำอะไรผิดไปมาก

@mbq ในEviewsเช่นนี้เป็นปกติสวยปฏิบัติเข้ารหัส ไม่ว่าฉันกำลังเกื้อหนุนมันอัตรา Eviews เพียงเล็กน้อยต่ำกว่า Excel ในรายการซอฟแวร์ที่ชั่วร้ายด้านบนของฉัน :)
mpiktas

6
@mpiktas ใน R มันเป็นธรรมชาติมากขึ้นในการสร้างรายการตั้งค่าnamesพารามิเตอร์ของมันและต่อมาก็อาจจะใช้attachมันหรือแปลงเป็นสภาพแวดล้อมที่มีlist2envและevalภายใน ไม่มีลูปแยกวิเคราะห์หรือสิ่งที่น่าเกลียดอื่น ๆ

@mbq, hm list2envเป็นฟังก์ชั่นที่ค่อนข้างใหม่ และก็ยังจะสร้างตัวแปรในบางสภาพแวดล้อมเมื่อ OP ต้องการรับตัวแปรในสภาพแวดล้อมด้านบน ดังนั้นความอัปลักษณ์ยังคง :)
mpiktas

2
สำหรับคำถามในอนาคตที่มีลักษณะคล้ายกันฉันขอแนะนำให้คำถามประเภทนี้เป็นของ StackOverflow คำถามไม่มีส่วนเกี่ยวข้องกับสถิติใด ๆ
ดาวอังคาร

คำตอบ:


41

assign()คุณกำลังมองหา

for(i in 1:3){
  assign(paste("a", i, sep = ""), i)    
}

จะช่วยให้

> ls()
[1] "a1"          "a2"          "a3" 

และ

> a1
[1] 1
> a2
[1] 2
> a3
[1] 3

ปรับปรุง

ฉันยอมรับว่าการใช้ลูปคือ (บ่อยมาก) สไตล์การเข้ารหัส R ไม่ดี (ดูการสนทนาด้านบน) การใช้list2env()(ขอบคุณ @mbq สำหรับการกล่าวถึง) นี่เป็นอีกหนทางแก้ไขคำถามของ @Han Lin Shang:

x <- as.list(rnorm(10000))
names(x) <- paste("a", 1:length(x), sep = "")
list2env(x , envir = .GlobalEnv)

21

หากค่าอยู่ในเวกเตอร์การวนซ้ำไม่จำเป็น:

vals <- rnorm(3)
n    <- length(vals)
lhs  <- paste("a",    1:n,     sep="")
rhs  <- paste("vals[",1:n,"]", sep="")
eq   <- paste(paste(lhs, rhs, sep="<-"), collapse=";")
eval(parse(text=eq))

นี่เป็นเหตุผลว่าทำไมฉันถึงรักอาร์


4
library(fortunes) fortune(106)
Roman Luštrik

@ Roman แปลกฉันเริ่มใช้parseหลังจากอ่านหน้าช่วยเหลือ R ฉันยอมรับว่าบางครั้งมันเป็น overkill เช่นในformulaการจัดการ แต่ฉันพบว่ามีประโยชน์มาก โปรดทราบว่าฉันไม่สามารถคิดใหม่คำถามตามที่แนะนำในโชคเนื่องจากฉันไม่ได้ถามมัน
mpiktas

1
@mpiktas: มันเกี่ยวข้องกับความจริงที่ว่ากฎการกำหนดขอบเขตพื้นฐานสามารถทำให้ได้ผลลัพธ์ที่ไม่สามารถคาดการณ์ได้เมื่อใช้ภายในฟังก์ชัน นอกจากนี้ (ดังที่กล่าวไว้ในไฟล์ช่วยเหลือ) R และ S สามารถให้ผลลัพธ์ที่แตกต่างเนื่องจากความแตกต่างในกฎการกำหนดขอบเขต มันยังช้ากว่าโซลูชันอื่น ๆ เรื่องนี้จะสำคัญเมื่อคุณต้องทำเช่นนี้หลายครั้ง และสุดท้าย แต่ไม่ท้ายสุดในกรณีส่วนใหญ่มีวิธีแก้ปัญหาที่สวยงามและง่ายกว่าการใช้ eval (parse ()) ในกรณีนี้ใช้งานได้กับรายการหรือใช้กำหนด
Joris Meys

1
@mpiktas: ฉันไม่เคยพูดว่ามันขาด ฉันเพิ่งให้เหตุผลแก่คุณว่าทำไมโดยทั่วไปแล้วการสร้าง eval (parse ()) ถูกแนะนำโดย Thomas Lumley สมาชิกของทีมพัฒนาหลัก R (cfr การอ้างอิงของ @Roman Lustrik)
Joris

1
แน่นอนว่าการปฏิบัติที่ไม่ดีเช่นการใช้มอบหมายเพื่อสร้างตัวแปรองค์ประกอบเดียวหลายรายการนั้นควรหมดกำลังใจ
mdsumner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.