Saya memiliki fungsi:

extract_tmp <- function(x,y)
{
  nr <- nrow(x$y)
  ind <- seq(6, nr, by = 12)
  out <- lapply(Map(seq, ind[ seq_along(ind) %% 2 == 1 ], ind[ seq_along(ind) %% 2 == 0 ]),
                function(i) x$y[i])
}

Ketika saya menelepon:

extract_tmp(JAN , tmp.2007.jan)

Itu kembali:

Error in seq.default(6, nr, by = 12) : 'to' must be of length 1

Dan ketika saya mengalihkan nrow() ke length() ia mengembalikan:

Error in seq.default(6, nr, by = 12) : wrong sign in 'by' argument 

Saya telah membaca situs ini dan memecahkan masalah selama beberapa jam, dan tidak dapat menyelesaikannya. Informasi tambahan:

length(JAN$tmp.2007.jan)
# 744
nrow(JAN$tmp.2007.jan)
# NULL
mode(JAN)
# "list"
mode(JAN$tmp.2007.jan)
# "numeric"

Terima kasih atas bantuan apa pun.

0
sethparker 18 Juni 2020, 00:53

1 menjawab

Jawaban Terbaik
extract_tmp <- function(x, y) {
  nr <- nrow(x)
  ind <- seq(6, nr, by = 12)
  out <- lapply(Map(seq, ind[ seq_along(ind) %% 2 == 1 ], ind[ seq_along(ind) %% 2 == 0 ]),
                function(i) x[[y]][i])
  out
}
extract_tmp(mtcars, "cyl")
# [[1]]
#  [1] 6 8 4 4 6 6 8 8 8 8 8 8 4
# [[2]]
#  [1] 6 8 4 4 4 8 8 8 8 4 4 4 4

Hal-hal yang diperbaiki:

  1. Secara umum, Anda tidak dapat memberikan nama kolom seperti itu yang tidak dikutip. Saya menyarankan agar Anda meneruskan string untuk argumen kedua dan menggunakan x[[y]] alih-alih x$y. (Dimungkinkan menggunakan substitute dan metode NSE (evaluasi non-standar) lainnya, tetapi ketika memulai di R, saya sarankan Anda tetap menggunakan evaluasi standar.

  2. nrow beroperasi pada bingkai, bukan vektor, jadi nrow(x) atau length(x[[y]]).

  3. Tidak masalah, per se, tetapi mungkin tampak seperti itu. Anda tidak secara eksplisit mengembalikan out dari fungsi Anda. Di R, dalam blok kode ekspresi terakhir biasanya dikembalikan. Ketika ekspresi terakhir itu adalah penugasan (<-), maka nilainya juga dikembalikan secara tidak terlihat (itulah sebabnya a <- b <- 2 berfungsi: ekspresi b <- 2 secara tidak terlihat mengembalikan nilai yang ditetapkan, yang kemudian mengalir ke a <- 2.

    Dalam hal ini, tanpa menambahkan out eksplisit seperti yang saya lakukan di atas, itu masih akan mengembalikan hasil yang Anda butuhkan, tetapi tampaknya tidak melakukan apa-apa: extract_tmp(mtcars, "cyl") akan tampak tidak menghasilkan apa-apa, tetapi jika Anda menetapkan hasilnya ke variabel dan lihat itu, atau jika Anda memanggil (extract_tmp(mtcars, "cyl")) sebagai gantinya (di sekeliling parens), maka Anda akan melihat hasilnya.

    Secara umum, saya sangat menyarankan Anda untuk eksplisit tentang variabel pengembalian Anda. Salah satu alasannya adalah kode deklaratif. Alasan lain adalah terkadang ekspresi terakhir tidak berfungsi pada semua nilai yang diperlukan. Misalnya, pertimbangkan blok ini:

    x <- 1:10
    x[3] <- 99
    

    dalam hal ini, tugas terakhir memiliki nilai 99, bukan konten x, jadi jika Anda bermaksud mengembalikan nilai menjadi seluruh vektor, maka Anda akan kehilangan.

1
r2evans 17 Juni 2020, 22:08