Как создать таблицу в реактивном объекте в Shiny - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь инициализировать реактивный data.frame в Shiny. Я думаю, что я почти там, но это не работает так, как ожидалось.

Ниже приведено очень простое приложение, которое я буду использовать только для пояснения. По сути, значения в таблице должны меняться в соответствии с sliderInput. И хотя они, кажется, делают это, вывод таблицы не выглядит так, как если бы таблица data.frame была похожа на r. Вместо обычного внешнего вида выводится только один столбец (с заголовком «данные»).

Не думаю, что я полностью понимаю, как работает реактивный объект (), и был бы признателен за любую помощь в том, как инициализировать таблицу в реактивном объекте. Спасибо!

library(shiny)

ui <- fluidPage(
  tableOutput("first"),
  sliderInput("num","choose num",1,10,1)
)

server <- function(input, output, session) {

  # t1 = (as.data.frame(forecast %>% filter(Date==Sys.Date()-21) %>% group_by(Resort,Date) %>% summarise(`Powder Total` = sum(Snow))))
  # t1=t1[order(t1$`Powder Total`,decreasing=TRUE),][1:5,]

  # output$first = renderTable({
  #   t1[1,]
  #   })

  test = reactive({
    d1 = as.data.frame(matrix(nrow=2,ncol = 2))
    names(d1)=c("col1","col2")
    d1$col1=input$num
    d1$col2=input$num+1
  })

  output$first=renderTable({
    test()
  })

}

shinyApp(ui, server)

1 Ответ

1 голос
/ 18 апреля 2020

Это происходит потому, что reactive() не возвращает фрейм данных, а возвращает вектор длины один. Вместо этого используйте reactiveValues().

library(shiny)

ui <- fluidPage(
  tableOutput("first"),
  sliderInput("num","choose num",1,10,1)
)

server <- function(input, output, session) {

  # t1 = (as.data.frame(forecast %>% filter(Date==Sys.Date()-21) %>% group_by(Resort,Date) %>% summarise(`Powder Total` = sum(Snow))))
  # t1=t1[order(t1$`Powder Total`,decreasing=TRUE),][1:5,]

  # output$first = renderTable({
  #   t1[1,]
  #   })

  tableData = reactiveValues(d1 = as.data.frame(matrix(nrow=2,ncol = 2)))

  observeEvent(input$num, {

    temp = tableData$d1
    names(temp)=c("col1","col2")
    temp$col1=input$num
    temp$col2=input$num+1

    tableData$d1 = temp

  })

  test = reactive({
    d1 = as.data.frame(matrix(nrow=2,ncol = 2))
    names(d1)=c("col1","col2")
    d1$col1=input$num
    d1$col2=input$num+1
  })

  output$first=renderTable({
    tableData$d1
  })

  observe({print(test())})        # check console output
  observe({print(tableData$d1)})  # check console output

  observe({print(is.data.frame(test()))
           print(is.data.frame(tableData$d1))

    })
}

shinyApp(ui, server)

Я включил несколько призывов к наблюдению, чтобы вы увидели, что test() не является фреймом данных.

enter image description here

...