Нулевой, блестящий - PullRequest
       11

Нулевой, блестящий

0 голосов
/ 13 сентября 2018

У меня есть функция для создания таблицы данных в 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 s, но это вернуло исходное сообщение об ошибке.

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

1 Ответ

0 голосов
/ 14 сентября 2018

Это не красиво, но я нашел решение. Были две разные проблемы. Один, когда не было данных, и другой, когда было только 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
}
...