简体   繁体   English

重新调整闪亮的反应变量

[英]relevel a reactive variable in shiny

I would like to use shiny to read a CSV file, and then allow the user to be able to choose the reference level in a specific column of that file.我想使用闪亮来读取 CSV 文件,然后允许用户能够在该文件的特定列中选择参考级别。 Imagine a data like this:想象一下这样的数据:

mydata <- data.frame(letter = rep(letters[1:3], 3), num = 1:9)
write.csv(mydata, "mydata.csv", row.names = FALSE)

Here is my code:这是我的代码:

library(shiny)
ui <- fluidPage(
  fileInput(
    "file",
    label = "File Input",
    accept = ".csv"
  ),
  selectInput(
    inputId = "ref",
    label = "Reference Outcome",
    choices = NULL
  ),
  actionButton( inputId = "action",
                label = "action"),
  textOutput("text")
)

server <- function(input, output, session) {
  observe({
    updateSelectInput(session,
                      "ref",
                      choices = unique(data()[,1]))
  })

  data <- reactive({
    inFile <- req(input$file)
    fileinput <- read.csv(inFile$datapath, header = TRUE, stringsAsFactors = FALSE)
    return(fileinput)
  })
  
  observeEvent(input$action,{
    data()$letter <- factor(data()$letter)
    data()$letter <- relevel(data()$letter, ref = input$ref)
    output$text <- renderText({
      paste("Your reference level is: ", levels(data()$letter)[1])
    }) 
  })  
}
shinyApp(ui, server)

I get this error :我收到此错误:

Warning: Error in <-: invalid (NULL) left side of assignment
  [No stack trace available]

I know that you should not use a reactive variable on the left side of the assignment, but how do I relevel the data after it was imported as a reactive variable?我知道您不应该在赋值左侧使用反应变量,但是在将数据作为反应变量导入后如何重新调整数据?

Try this尝试这个

server <- function(input, output, session) {
  rv <- reactiveValues(df=NULL)
  observe({
    updateSelectInput(session,
                      "ref",
                      choices = unique(data()[,1]))
  })
  
  data <- reactive({
    inFile <- req(input$file)
    fileinput <- read.csv(inFile$datapath, header = TRUE, stringsAsFactors = FALSE)
    return(fileinput)
  })
  
  observeEvent(input$action,{
    rv$df <- data()
    rv$df$letter <- factor(rv$df$letter)
    rv$df$letter <- relevel(rv$df$letter, ref = input$ref)
    output$text <- renderText({
      paste("Your reference level is: ", levels(rv$df$letter)[1])
    }) 
  })  
}

Here is pretty much the same answer, except that the dataframe value is not updated every time you click on the action button.这是几乎相同的答案,只是每次单击操作按钮时数据框值都不会更新。 It's only updated when the file is uploaded.它仅在文件上传时更新。

library(shiny)

mydata <- data.frame(letter = rep(letters[1:3], 3), num = 1:9)
write.csv(mydata, "mydata.csv", row.names = FALSE)
  
  
ui <- fluidPage(
  fileInput(
    "file",
    label = "File Input",
    accept = ".csv"
  ),
  selectInput(
    inputId = "ref",
    label = "Reference Outcome",
    choices = NULL
  ),
  actionButton( inputId = "action",
                label = "action"),
  textOutput("text")
)

server <- function(input, output, session) {
  observe({
    updateSelectInput(session,
                      "ref",
                      choices = unique(data()[,1]))
  })
  
  data <- reactive({
    inFile <- req(input$file)
    fileinput <- read.csv(inFile$datapath, header = TRUE, stringsAsFactors = FALSE)
    r$df <- fileinput
  })
  
  r <- reactiveValues(
    df = NULL
  )

  observeEvent(input$action,{
    r$df$letter <- factor(r$df$letter)
    r$df$letter <- relevel(r$df$letter, ref = input$ref)
    output$text <- renderText({
      paste("Your reference level is: ", levels(r$df$letter)[1])
    }) 
  })  
}
shinyApp(ui, server)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM