R - понимание цикла и почему он захватывает только 10 предметов - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующий код (заметьте, не обращайте на меня внимания, это не мой код, я исправляю проблему, обнаруженную при модификации этого кода.)

<!--begin.rcode echo=FALSE, results='asis', message=FALSE
overLevel <- 0
step <- 10

for(i in seq(1, nrow(exposures), by=step)) {
  tryCatch({
    tmp <- exposures[i:(i+step-1),]
    cols <- ifelse( (as.numeric(gsub(",","",gsub(" ","",tmp$ARExcess)))) >  overLevel, 'tomato', 
                 ifelse(as.numeric(gsub(",","",gsub(" ","",tmp$MTMExcess))) > overLevel, 'lightyellow', 
                 ifelse(as.numeric(gsub(",","",gsub(" ","",tmp$VolumeExcess))) > overLevel, 'azure3', 'white')))

    cat(paste0('<h4><u>Exposures</u></h4>'))
    cat(htmlTable(as.matrix(tmp), col.rgroup = cols, rnames = FALSE))
  },error = function(e) {print(e)})
}

end.rcode-->

Проблема, с которой я сталкиваюсь, состоит в том, что он берет по 10 элементов за раз (строка for в коде) из набора данных эксцессов и помещает их в набор данных tmp по 10 записей за раз. При наличии менее 10 записей он удаляется и не добавляет дополнительные элементы в файл RHTML, что приводит к неполному отчету или отсутствию отчета в зависимости от записей.
Как бы я мог завершить все записи, независимо от того, есть ли 10 или нет. Для удобства чтения в электронной почте (бизнес-правила) он должен быть размером 10 патронов, поэтому я согласен, что его размер равен 10, а на последнем - короче, но я не знаю, как выполнить последнюю часть. Кто-нибудь знает, как я могу это исправить или протянуть руку помощи?

1 Ответ

0 голосов
/ 02 июля 2018

В вашем коде вы используете tmp <- exposures[i:(i+step-1),], но i+step-1 может выходить за пределы количества строк. Это может дать NA в tmp. Например (используя mtcars)

> dim(mtcars)
[1] 32 11
> mtcars[30:34,]
               mpg cyl disp  hp drat   wt qsec vs am gear carb
Ferrari Dino  19.7   6  145 175 3.62 2.77 15.5  0  1    5    6
Maserati Bora 15.0   8  301 335 3.54 3.57 14.6  0  1    5    8
Volvo 142E    21.4   4  121 109 4.11 2.78 18.6  1  1    4    2
NA              NA  NA   NA  NA   NA   NA   NA NA NA   NA   NA
NA.1            NA  NA   NA  NA   NA   NA   NA NA NA   NA   NA

Обратите внимание, что, поскольку я попытался захватить строки за пределы измерений, он просто возвращает NA. В конечном итоге это приводит к проблемам в том, что вы затем используете это для определения cols, что может привести к NA в cols. htmlTable, кажется, прекрасно обрабатывает NA в параметре x, но выдает ошибку, когда NA передается параметру col.rgroup.

Самым простым решением было бы убедиться, что вы не захватываете ничего после окончания данных. Конечно, есть лучшие способы сделать это, но решение, которое требует минимальных изменений в вашем коде, состояло бы в том, чтобы заменить строку проблемы на

tmp <- exposures[seq(i, min(nrow(exposures), i+step-1)),]

, который гарантирует, что вы не пытаетесь захватить строки за пределами ваших данных.

Как уже упоминалось в комментариях, несомненно, есть лучший способ решения этой проблемы, и я думаю, что рефакторинг может быть в порядке, но я все же хотел помочь понять , почему это происходило, так что вы можете избежать ( или обнаружить) такие ловушки в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...