R menghitung baris kerangka data dalam daftar: for loop berperilaku berbeda dari penerapan?

Jadi saya menemukan masalah yang sangat aneh dalam menulis fungsi kemudahan untuk menghitung jumlah baris di setiap kerangka data dalam daftar kerangka data. Saya pikir pasti ada beberapa perilaku dasar yang saya lewatkan, seperti pengindeksan pada daftar tidak berfungsi seperti yang saya kira, atau ada sesuatu yang dipaksa ke jenis variabel yang salah atau semacamnya. Adakah yang bisa membantu saudaranya?

Contoh yang dapat direproduksi:

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

Saya pasti melewatkan sesuatu yang jelas di sini.

Ya, saya tahu ini bisa dilakukan dengan mudah dengan lapply(dflist, nrow) --- dan itu benar-benar menghasilkan keluaran yang tepat. Tapi yang jelas saya tidak tahu cara mengulang elemen daftar dengan benar, dan itu adalah masalah selain karena ada cara yang lebih mudah untuk melakukan apa yang ingin saya capai...

Edit: seorang pemberi komentar yang baik hati menunjukkan bahwa saya memiliki pernyataan return di dalam loop for, ups. Namun, memperbaikinya masih menghasilkan keluaran buruk yang sama:

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

suntingan kedua: Saya buruk dalam menghindari kesalahan sintaksis yang bodoh, seperti lupa memulai loop pada 1. Ups ganda. Lihat komentar dari Neal Fultz, yang tidak terlalu buruk dalam menghindari kesalahan sintaksis yang bodoh dibandingkan saya.


person Paul Gowder    schedule 22.05.2015    source sumber
comment
Pengembalian Anda terlalu dini, ia keluar sebelum perulangan selesai.   -  person Neal Fultz    schedule 22.05.2015
comment
Saya seorang idiot. ups. Terima kasih.   -  person Paul Gowder    schedule 22.05.2015
comment
Namun, versi yang dikoreksi dengan pernyataan return di luar loop for masih menghasilkan keluaran buruk yang sama.   -  person Paul Gowder    schedule 22.05.2015
comment
Coba 1:length(pglist) di perulangan for.   -  person Neal Fultz    schedule 22.05.2015
comment
ooh. Ya. itu juga. begitu banyak kesalahan sintaksis, semua kesalahan sintaksis! Itu memperbaikinya. terima kasih.   -  person Paul Gowder    schedule 22.05.2015
comment
Saat saya menjalankan contoh Anda dan mengetik df1, muncul kesalahan: duplikat nama baris.   -  person Frank    schedule 22.05.2015


Jawaban (1)


Kode Anda bermasalah, harus 1:length(pglist) bukan hanya length(pglist) di bagian for(). Anda mengulang untuk i hanya dalam panjang (pglist). Juga diperlukan untuk mengeluarkan ekspresi return dari loop.

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

Ini seharusnya berfungsi seperti yang diharapkan sekarang. Bersulang

Sunting: Saya belum diperbolehkan berkomentar

person user3239929    schedule 22.05.2015