Как заставить R shiny загрузить данные из моей функции renderDataTable?

#r #shiny

Вопрос:

Поэтому мне было трудно заставить данные в моей renderDataTable функции работать с этой downloadHandler функцией. Итак, проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю приложение shiny, устанавливаю флажок для опции фильтра, выбираю переменную пол 0(женский) и загружаю данные, я получаю все наблюдения, как и предполагалось, в отфильтрованных данных.

Примеры данных:

 "","age","sex","bmi","children","smoker","region","expenses"
"1",19,"0",27.9,0,"1","0",16884.92
"2",18,"1",33.8,1,"0","1",1725.55
"3",28,"1",33,3,"0","1",4449.46
"4",33,"1",22.7,0,"0","2",21984.47
"5",32,"1",28.9,0,"0","2",3866.86
"6",31,"0",25.7,0,"0","1",3756.62
"7",46,"0",33.4,1,"0","1",8240.59
"8",37,"0",27.7,3,"0","2",7281.51
"9",37,"1",29.8,2,"0","3",6406.41
"10",60,"0",25.8,0,"0","2",28923.14
"11",25,"1",26.2,0,"0","3",2721.32
"12",62,"0",26.3,0,"1","1",27808.73
"13",23,"1",34.4,0,"0","0",1826.84
"14",56,"0",39.8,0,"0","1",11090.72
"15",27,"1",42.1,0,"1","1",39611.76
"16",19,"1",24.6,1,"0","0",1837.24
"17",52,"0",30.8,1,"0","3",10797.34
"18",23,"1",23.8,0,"0","3",2395.17
"19",56,"1",40.3,0,"0","0",10602.39
"20",30,"1",35.3,0,"1","0",36837.47
 

ui.R:

       tabItem(tabName = "data",
          h2("Insurance Data Page"),
          checkboxInput("dataset","Filter option:"),
          conditionalPanel(
            condition = "input.dataset==true",
            selectInput("sex", "Variable sex:", levels(insurance_data_update$sex))
          ),
          dataTableOutput("data_read"),
          downloadButton("data_saved","Download this data")
      ),
 

сервер.R:

   #Filtering factor columns
  getData <- reactive({
  newData <- insurance_data_update #%>% filter(sex == input$sex)#, smoker==input$smoker, region==input$region)
  })

  # Reading in the data
  output$data_read = renderDataTable({
  #newData <- getData()
  if(input$dataset==TRUE){
     if(input$sex==0){
        #newData <- newData %>% filter(sex==input$sex)
        getData() %>% filter(sex==input$sex)
        getData()
       #newData
     }else{
       #newData <- newData %>% filter(sex==input$sex)
       #newData
       getData() %>% filter(sex==input$sex)
       getData()
     }
  }else{
     #newData
     getData()
  }
  output$data_saved = downloadHandler(
     filename="insurance.csv",
     content = function(file){
       write.csv(getData(), file)
     }
  )
 

Я не совсем уверен, что делаю не так.

Мы будем очень признательны за любую помощь.

Ответ №1:

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

 #Filtering factor columns
getData <- reactive({
  insurance_data_update
})

tableData <- reactive({
 if(input$dataset==TRUE){
     if(input$sex==0){
        getData() %>% filter(sex==input$sex)
     } else {
       getData() %>% filter(sex==input$sex)
     }
  }else{
     getData()
  }
})
 
output$data_read = renderDataTable({
  tableData()
})

output$data_saved = downloadHandler(
   filename="insurance.csv",
   content = function(file){
     write.csv(tableData(), file)
   }
)
 

Ответ №2:

Я думаю, это должно сработать.

Редактировать: Существуют различные входные данные, которые могут быть взяты из таблиц данных, и это приведет к экспорту данных ( getData() ) в том виде, в каком они отображаются в таблице данных, что означает, что любая фильтрация, которую вы выполняете в таблице, будет отражена, а также фильтрация, выполняемая для передаваемых данных DT . Вывод для output$data_read datatable, data_read_rows_all , — это то , что поступает во входное значение, которое в основном является именем выхода _rows_all .

   output$data_saved = downloadHandler(
     filename="insurance.csv",
     content = function(file){
       write.csv(getData()[input[["data_read_rows_all"]], ], file)
     }
 

Проверьте здесь для получения дополнительной информации!

Комментарии:

1. Исправлена ваша неработающая ссылка. Вы могли бы дать лучший ответ, объяснив, какие принципы были необходимы для построения этого фрагмента кода.