我正在制作一个闪亮的,在那里我可以读取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)