R блестящий;глобально определить поведение АН в рендерах - PullRequest
0 голосов
/ 09 марта 2019

При создании приложения Shiny с множеством таблиц, содержащих некоторые значения NA, может быть полезно глобально определить, как печатать NA, например, renderTable.

. В качестве примера:

library(shiny)
ui <- fluidPage(
  column(2,uiOutput("ourTable")),
  column(2,uiOutput("ourTable2"))
)

server <- function(input, output) {
  data<-data.frame(A=1:6, B=LETTERS[11:16], C=c(1,2,"A", "B", NA, NA))
  output$ourTable<-renderTable({data})
  output$ourTable2<-renderTable({data}, na="")
}

shinyApp(ui = ui, server = server)

Это выглядит так:

enter image description here

В идеале, я хотел бы добавить строку кода (на сервере или в пользовательском интерфейсе).) чтобы все таблицы отображались как ourTable2, то есть без вывода на печать NA и без явного указания этого для каждой добавляемой таблицы.

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Вы можете определить следующее в вашем файле global.R (или в файле server.R), если хотите. Который будет работать на ваших столах, а также будет возвращать "", если вся таблица - NA Если вы передаете сложные объекты, такие как встроенные списки списков, это должно быть немного сложнее. Однако печать data.frame, как в OP, будет работать.

в global.R (или в другом месте):

format.NAs <- function(x) {
  if (identical(x,NA)) return ("")
  x <- as.data.frame(lapply(df,unclass)) #to accommodate factors()
  x[is.na(x)] <- ""
  return (x)
}

В вашем server.r (или модулях пользовательского интерфейса или там, где это необходимо)

 output$ourTable2<-renderTable({format.NAs(data)})

Общий пример:

df <- data.frame(A=c(2,4,6,8),B=c(1,NA,9,7),C=c("test",NA,"test1",NA),stringsAsFactors = F)
> format.NAs(df)
  A B     C
1 2 1  test
2 4        
3 6 9 test1
4 8 7      
0 голосов
/ 09 марта 2019

Комментарий Рикардо под мой вопрос Я написал следующую обертку, которая добивается цели для всех отображаемых таблиц (но не для других способов вывода таблиц):

renderTableNew<-function(x){renderTable({x}, na="")}

Очевидно, что этот «трюк» можно использовать для определения большего количества аргументов renderTable(), и можно создать несколько таких функций с различными параметрами. При использовании этого, единственное, что следует опасаться, это то, что вам придется использовать renderTableNew() вместо renderTable.

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