Null datatable shiny

У меня есть функция для создания таблицы данных в Shiny на основе номеров отделов и того, сколько раз в этом отделе происходило событие за период времени. Моя проблема в том, что если диапазон дат достаточно короткий, событие не произойдет ни в одном отделе. В этих случаях я получаю сообщение об ошибке Error in rowSums(x) : 'x' must be an array of at least two dimensions, которое изначально только что появилось в приложении Shiny, и вы могли просто проигнорировать его. Теперь приложение вылетает, и вам нужно вернуться в R, чтобы посмотреть на него.

Я понимаю, почему возникает ошибка, но я не знаю, есть ли способ ее обойти в моей ситуации, потому что я не знаю, происходят ли события, пока данные не будут подмножества. Функция вызывается в моем коде несколько раз, поэтому я не хочу писать оператор if вне функции каждый раз, когда она используется.

Я попытался добавить if(length(b$Department <= 1)){tab<-renderDataTable({datatable(NULL)})} сразу после определения b, а затем оставил оператор else вокруг оставшейся части функции, но я получил сообщение Warning: Error in [.data.frame: undefined columns selected

Я также пробовал другие операторы if, такие как создание фрейма данных, полного NA, но это вернуло исходное сообщение об ошибке.

dept.table<-function(df, date1, date2){
  a<-df[which(DATE >= as.Date(date1) & DATE <= as.Date(date2)),]
  b<-as.data.frame(table((a[,c("Event", "Department")])))
  d<-reshape(b, direction="wide", idvar="Event", timevar="Department")
  names(d)<-sub('^Freq\\.', '', names(d)) 
  d$Total<-round(rowSums(d[,-1]), 0)
  levels(d$Event)<-c(levels(d$Event), "Total")
  d<-rbind(d, c("Total", colSums(d[,-1])))tab<-DT::renderDataTable({
  datatable(d, extensions="FixedColumns", options=list(dom='t', scrollX=T, fixedColumns=list(leftColumns=1, rightColumns=1)), rownames=FALSE)
 })
}

Образец данных

 df<-data.frame(Department=rep(100:109, 3), Event=rep(c("A", "B", "C"),10),
     Date=sample(seq(as.Date('2018/01/01'), as.Date('2018/09/01'), by="day"), 30))
0
0
328
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это некрасиво, но я нашел решение. Было две разные проблемы. Один, когда данных не было, а другой, когда было только 2 отдела, поэтому мне понадобились два оператора if.

dept.table<-function(df, date1, date2)  {a<-df[DATE >= as.Date(date1) & DATE <= as.Date(date2)),]
   b<-as.data.frame(table((a[,c("Event", "Department")])))
   if(nrow(b)==0){tab<-DT::renderDataTable(NULL)}
   else{d<-reshape(b, direction="wide", idvar="CODE", timevar="Department")
        names(d)<-sub('^Freq\\.', '', names(d)) 
        if(ncol(d)>3){d$Total<-round(rowSums(d[,-1]), 0)
          levels(d$Event)<-c(levels(d$Event), "Total")
          d<-rbind(d, c("Total", colSums(d[,-1])))
          tab<-DT::renderDataTable({
               datatable(d, extensions="FixedColumns", options=list(dom='t', scrollX=T, fixedColumns=list(leftColumns=1, rightColumns=1)), rownames=FALSE)})}
        else{tab<-DT::renderDataTable(datatable(d))}
   }
 tab
}

Другие вопросы по теме