R การนับแถวของ dataframes ในรายการ: for loop มีพฤติกรรมแตกต่างจาก Apply หรือไม่

ดังนั้นฉันจึงพบปัญหาที่แปลกมากในการเขียนฟังก์ชันอำนวยความสะดวกเพื่อนับจำนวนแถวในแต่ละดาต้าเฟรมในรายการดาต้าเฟรม ฉันคิดว่าต้องมีพฤติกรรมพื้นฐานบางอย่างที่ฉันขาดหายไป เช่น การจัดทำดัชนีรายการไม่ทำงานอย่างที่คิด หรือมีบางอย่างถูกบังคับให้ใช้ตัวแปรผิดประเภทหรืออะไรบางอย่าง ใครก็ได้ช่วยน้องหน่อยได้ไหม?

ตัวอย่างที่ทำซ้ำได้:

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 ซึ่งหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์ที่แย่น้อยกว่าฉัน


person Paul Gowder    schedule 22.05.2015    source แหล่งที่มา
comment
การกลับมาของคุณเร็วเกินไป มันจะออกก่อนที่การวนซ้ำจะสิ้นสุด   -  person Neal Fultz    schedule 22.05.2015
comment
ฉันเป็นคนงี่เง่า โอ้อุ๊ย ขอบคุณ.   -  person Paul Gowder    schedule 22.05.2015
comment
อย่างไรก็ตาม เวอร์ชันที่แก้ไขแล้วซึ่งมีคำสั่ง return อยู่นอก for loop ยังคงให้ผลลัพธ์ที่แย่เหมือนเดิม   -  person Paul Gowder    schedule 22.05.2015
comment
ลอง 1:length(pglist) ใน for loop   -  person Neal Fultz    schedule 22.05.2015
comment
โอ้ ใช่. นั่นก็ใช่. ไวยากรณ์ผิดพลาดมากมาย ข้อผิดพลาดทางไวยากรณ์ทั้งหมด! นั่นแก้ไขมัน ขอบคุณ.   -  person Paul Gowder    schedule 22.05.2015
comment
เมื่อฉันเรียกใช้ตัวอย่างของคุณและพิมพ์ df1 มันทำให้เกิดข้อผิดพลาด: ชื่อแถวที่ซ้ำกัน   -  person Frank    schedule 22.05.2015


คำตอบ (1)


รหัสของคุณมีปัญหา โดยจะต้องเป็น 1:length(pglist) ไม่ใช่แค่ length(pglist) ในส่วน for() คุณวนซ้ำสำหรับฉันในความยาวเท่านั้น (pglist) จำเป็นต้องนำนิพจน์การส่งคืนออกจากลูปด้วย

countrows <- function(pglist) {
  dfsizes <- rep(NA, length(pglist))
  for (i in 1:length(pglist)) {
    dfsizes[i] <- nrow(pglist[[i]])
  }  
  return(dfsizes)
}

newvector <- countrows(dflist)
newvector

สิ่งนี้ควรจะทำงานได้ตามที่คาดไว้ตอนนี้ ไชโย

แก้ไข: ฉันยังไม่ได้รับอนุญาตให้แสดงความคิดเห็น

person user3239929    schedule 22.05.2015