Использование блестящего для создания таблицы данных, которую можно загрузить и которая использует функции dplyr - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь создать блестящее приложение, которое принимает различные входные данные и создает выходную таблицу, в которой есть столбцы, в которых записываются пользовательские входные данные и вычисляется поле затрат на основе пользовательских входных данных. Мне удалось создать таблицу данных с пользовательскими вводами, но я не могу получить поле, которое вычисляет что-то новое на основе входных данных.

data <- structure(list(product = c("Cars", "Trucks", "Buses", "Cars", 
"Trucks", "Buses"), offshore = c(0, 0, 0, 1, 1, 1)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))


               library(shiny)
                library(DT)
                library(data.table)
                library(lubridate)
                library(tidyverse)


                mydata = data.frame(Product=NA,
                                    Start_date = NA,
                                    End_date = NA,
                                    On_shore_cost = NA,
                                    Off_shore_cost = NA,
                                    Cost = NA)
             ui <- fluidPage(
              wellPanel(
               flowLayout(
                 selectInput("select", "Product", 
                                      choices = list("Cars"  = 1,
                                                     "Trucks" = 2,
                                                     "Buses" = 3), selected = 1),   
                 dateInput("sdate", "Start date"),
                 dateInput("edate", "End date"),
                 numericInput("onshore","On-Shore Cost",1),
                 numericInput("offshore","Off-Shore Cost",1)
                 actionButton("action","Blast Off")),
                 downloadButton("downloadData", "Download")),
                 dataTableOutput("table")


        )

Поле, которое я пытаюсь создать, это поле "Cost =". Я использую выражение dplyr для манипулирования данными. Я не могу заставить это работать. В качестве бонуса, когда пользователь создает таблицу, которую он хочет, я хотел бы, чтобы он мог ее скачать. Я еще не потратил много времени на загрузку. Не могли бы вы помочь мне выяснить, как заполнить поле «Стоимость» таблицы данных?

    # Define server logic 
    server <- function(input, output) {

     output$table <- renderDataTable( df())

     df <-  eventReactive(input$action,{
      if(input$select!="" && !is.null(input$onshore)  && input$action>0){
       newrow = data.table(Product = input$select, 
                   Start_date = as.character(input$sdate),
                   End_date = as.character(input$edate),
                   On_shore_cost =input$onshore,
                   Off_shore_cost = input$offshore,


#########This is the trouble spot, I am trying to generate this field
                   Cost = renderText({data %>% filter(product == input$select) %>% 
    mutate(pc_cost= ifelse(offshore == 0 , input$onshore,input$offshore)) %>%
          summarise(total = sum(pc_cost)) %>% pull()}) )


     mydata <<- rbind(mydata, newrow)


      }
      mydata
     }, ignoreNULL = FALSE)  
    }


    # Run the application 
    shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 03 ноября 2018

Я думаю, что в вашем коде было несколько ошибок. Но вы ищете что-то подобное? Я думаю, что одной из проблем были номера, которые вы присвоили продуктам. Он не может фильтровать правильно.

 ui <- fluidPage(
              wellPanel(
               flowLayout(
                 selectInput("select", "Product", 
                                      choices = list("Cars",
                                                     "Trucks",
                                                     "Buses"), selected = "Cars"),   
                 dateInput("sdate", "Start date"),
                 dateInput("edate", "End date"),
                 numericInput("onshore","On-Shore Cost",1),
                 numericInput("offshore","Off-Shore Cost",1),
                 actionButton("action","Blast Off")),
                 downloadButton("downloadData", "Download")),
                 dataTableOutput("table")


        )

server <- function(input, output) {

  #observeEvent(input$action,{
    output$table <- DT::renderDataTable( df())

 # })


  df <-  eventReactive(input$action,{
   # if(input$select!="" && !is.null(input$onshore)  && input$action>0){
      newrow = data.frame(Product = input$select, 
                          Start_date = as.character(input$sdate),
                          End_date = as.character(input$edate),
                          On_shore_cost =input$onshore,
                          Off_shore_cost = input$offshore)


                          #########This is the trouble spot, I am trying to generate this field
      Cost = data %>% dplyr::filter(as.factor(product) %in% c(paste(as.factor(input$select))))  %>% 
        mutate(pc_cost= ifelse(as.numeric(offshore) == 0, as.numeric(input$onshore), as.numeric(input$offshore))) %>%
        summarise(total = sum(pc_cost)) %>% pull()


      mydata <<- cbind(Cost, newrow)
      mydata

  })
}


# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...