R Shiny, Mutate Replace, Как изменить указанный c столбец, выбранный из selectInput во фрейме данных? - PullRequest
0 голосов
/ 12 июля 2020

Я делаю блестящий, где я могу прочитать файл CSV, а затем иметь возможность заменить выбранный столбец новым значением (которое в данном случае заменено на 0). Обычно я использую для этого функцию изменения.

Как правильно использовать функцию изменения в блестящем, когда выбранный столбец также является входом?

ui <- fluidPage(fileInput('file1', h2('Dataset Settings'),
                          accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')),
                tags$hr(),
                
                selectInput(inputId = "replaceCol",
                            label = "Select numeric with missing value",
                            choices = c()),
                actionButton(inputId = "confirm", 
                             label = "Replace with 0"),
                tags$hr(),
                dataTableOutput("Original")
)
  



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

  data_set <- reactive({
    inFile <- input$file1
    read.csv(inFile$datapath)
  })
  
  observe({
    req(input$file1)
    temp <- colnames(data_set())
    col <- list()
    col[temp] <- temp
    updateSelectInput(session,
                      inputId = "replaceCol",
                      choices = col,
                      selected = "")
  })
  
  output$Original <- renderDataTable({
    data_set()
  })

  
  observeEvent(input$confirm,{
    data_set() <- mutate(data_set(), replace(input$replaceCol, TRUE, 0))
  })
  
}

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 12 июля 2020

В вашем коде есть несколько проблем:

  • если элемент пользовательского интерфейса зависит от некоторых вычислений из server, лучше использовать renderUI
  • вы не можете напрямую назначить что-то выходу реактивной функции
  • , если вы хотите динамически генерировать имена переменных в dplyr, это немного сложнее

Следовательно , Я использую reactiveVal для хранения вашего набора данных и обновления его при изменении столбца. Я не полностью удовлетворен использованием наблюдателя для обновления data_set() при выборе нового файла, я рад услышать, есть ли у кого-то лучшее решение.

library(shiny)
library(dplyr)

ui <- fluidPage(fileInput('file1', h2('Dataset Settings'),
                          accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')),
                tags$hr(),
                
                uiOutput(outputId = "UI_replaceCol"),
                actionButton(inputId = "confirm", 
                             label = "Replace with 0"),
                tags$hr(),
                dataTableOutput("Original")
)




server <- function(input, output, session){
  
  # reactive variable to store the data
  data_set <- reactiveVal()
  
  observeEvent(input$file1, {
    inFile <- input$file1
    data <- read.csv(inFile$datapath)
    data_set(data)
  })
  
  output$UI_replaceCol <- renderUI({
    req(data_set())
    col <- colnames(data_set())
    selectInput(inputId = "replaceCol",
                label = "Select numeric with missing value",
                choices = col)
  })
  
  output$Original <- renderDataTable({
    data_set()
  })
  
  
  observeEvent(input$confirm,{
    data <- data_set() %>% 
      mutate(!!as.symbol(input$replaceCol) :=
               replace(!!as.symbol(input$replaceCol), TRUE, 0))
    
    data_set(data)
  })
  
}

shinyApp(ui = ui, server = server)
...