R闪亮,突变替换,如何在数据帧中突变从selectInput中选择的特定列



我正在制作一个闪亮的,在那里我可以读取CSV文件,然后可以用新值替换所选列(在本例中用0替换(
我通常使用mutate函数来执行此操作。

当选中的列也是一个输入时,如何正确使用突变函数?

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)

您的代码有几个问题:

  • 如果UI元素依赖于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)

最新更新