Устранение ошибки nrow / length (list) в функции R - PullRequest
0 голосов
/ 18 июня 2020

У меня есть функция:

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])
}

Когда я звоню:

extract_tmp(JAN , tmp.2007.jan)

, он возвращает:

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

и когда я переключаю nrow() на length() он возвращает:

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

Я читал этот сайт и устранял неполадки в течение нескольких часов, но не смог их решить. Дополнительная информация:

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

Спасибо за любую помощь.

1 Ответ

1 голос
/ 18 июня 2020
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

Исправлено:

  1. В общем смысле вы не можете передать такое имя столбца без кавычек. Вместо этого я предлагаю передать строку для второго аргумента и использовать x[[y]] вместо x$y. (Возможно использование substitute и других методов NSE (нестандартной оценки), но, начиная с R, я предлагаю вам остаться со стандартной оценкой.

  2. nrow работает на кадров, а не векторов, поэтому nrow(x) или length(x[[y]]).

  3. Само по себе это не проблема, но может показаться, что это одна из них. Вы явно не возвращали out из ваша функция. В R в блоке кода обычно возвращается последнее выражение. Когда это последнее выражение является присваиванием (<-), его значение также невидимо возвращается (вот почему a <- b <- 2 работает: выражение b <- 2 невидимо возвращает назначенное значение, которое затем каскадно превращается в a <- 2.

    В этом случае, без добавления явного out, как я сделал выше, он все равно вернет нужные вам результаты, но будет кажется, что ничего не делает: extract_tmp(mtcars, "cyl") будет казаться, что ничего не возвращает, но если вы присвоите результаты переменной и посмотрите на нее, или если вместо этого вызовете (extract_tmp(mtcars, "cyl")) (окружающие скобки), то вы увидите результат.

    В общем, я настоятельно рекомендую вам четко указывать свои возвращаемые переменные. Одна из причин - декларативный код. Другая причина в том, что иногда последнее выражение не работает со всеми необходимыми значениями. Например, рассмотрим этот блок:

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

    в этом случае последнее присваивание имеет значение 99, а не содержимое x, поэтому, если вы предполагали, что возвращаемое значение будет целым вектором, тогда вы пропустите.

...