ดังนั้นฉันจึงพบปัญหาที่แปลกมากในการเขียนฟังก์ชันอำนวยความสะดวกเพื่อนับจำนวนแถวในแต่ละดาต้าเฟรมในรายการดาต้าเฟรม ฉันคิดว่าต้องมีพฤติกรรมพื้นฐานบางอย่างที่ฉันขาดหายไป เช่น การจัดทำดัชนีรายการไม่ทำงานอย่างที่คิด หรือมีบางอย่างถูกบังคับให้ใช้ตัวแปรผิดประเภทหรืออะไรบางอย่าง ใครก็ได้ช่วยน้องหน่อยได้ไหม?
ตัวอย่างที่ทำซ้ำได้:
myvec <- c(1,2,3,4,5)
df1 <- as.data.frame(rbind(myvec, myvec))
df2 <- as.data.frame(rbind(myvec, myvec, myvec))
dflist <- list(df1, df2)
nrow(dflist[[1]])
# output as expected: [1] 2
nrow(dflist[[2]])
# output as expected: [1] 3
# convenience function
countrows <- function(pglist) {
dfsizes <- rep(NA, length(pglist))
for (i in length(pglist)) {
dfsizes[i] <- nrow(pglist[[i]])
return(dfsizes)
}
}
newvector <- countrows(dflist)
newvector
# output totally not as expected: [1] NA 3
ฉันต้องพลาดบางสิ่งบางอย่างที่ชัดเจนที่นี่
ใช่ ฉันรู้ว่าสิ่งนี้สามารถทำได้ง่ายอย่างสมบูรณ์แบบด้วย lapply(dflist, nrow)
--- และนั่นให้ผลลัพธ์ที่ถูกต้องจริงๆ แต่ชัดเจนว่าฉันไม่รู้วิธีวนซ้ำองค์ประกอบของรายการอย่างถูกต้อง และนั่นเป็นปัญหาโดยสิ้นเชิง นอกเหนือจากการมีวิธีที่ง่ายกว่าในการทำสิ่งที่ฉันพยายามทำให้สำเร็จ...
แก้ไข: ผู้แสดงความคิดเห็นใจดีชี้ให้เห็นว่าฉันมีคำสั่ง return อยู่ใน for loop โอ๊ะโอ อย่างไรก็ตาม การแก้ไขที่ยังคงให้ผลลัพธ์ที่ไม่ดีเหมือนเดิม:
countrows2 <- function(pglist) {
dfsizes <- rep(NA, length(pglist))
for (i in length(pglist)) {
dfsizes[i] <- nrow(pglist[[i]])
}
return(dfsizes)
}
doom <- countrows2(dflist)
doom
# still bad output: [1] NA 3
แก้ไขครั้งที่สอง: ฉันหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์ที่โง่เขลาได้ไม่ดี เช่น ลืมเริ่มวนซ้ำที่ 1 ดับเบิ้ลโห่ ดูความคิดเห็นจาก Neal Fultz ซึ่งหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์ที่แย่น้อยกว่าฉัน
1:length(pglist)
ใน for loop - person Neal Fultz   schedule 22.05.2015df1
มันทำให้เกิดข้อผิดพลาด: ชื่อแถวที่ซ้ำกัน - person Frank   schedule 22.05.2015