从 R Shiny 中为 SliderInput 参数上传的 CSV 文件访问数据框的元素

Access elements of dataframe from uploaded CSV file in R Shiny for SliderInput arguments

我想将 CSV 文件上传到 Shiny 应用程序,并为 valueminmax 更新 CSV 文件中的值, 在 UI 中的输入滑块上。这在 Shiny 中似乎是一项简单的任务,但我能找到的关于 SO 的所有示例都非常冗长。

要上传的测试文件在这里:

write.csv(data.frame("parameter" = c("a", "b"), 
                     "value" = c(1.2, 3.4), 
                     "min" = c(1, 3), 
                     "max" = c(2, 4)),
          "input_test.csv", 
          row.names = FALSE)

这里有一个非常简单的 Shiny 应用程序:

library(shiny)

ui <- fluidPage(
    fileInput("filename", "Choose CSV File", accept = ".csv"),
    tableOutput("contents"),
    sliderInput(inputId = 'num', label = "a", value = 1.5, min = 0, max = 5),
    sliderInput(inputId = 'num', label = "b", value = 3.5, min = 0, max = 5)
)

server <- function(input, output) {
    output$contents <- renderTable({
        inFile <- input$filename
        if (is.null(inFile))
            return(NULL)
        read.csv(inFile$datapath)
    })
}

shinyApp(ui, server)

在为 valueminmax 列上传 CSV 文件后,如何使 sliderInput 参数更新为这些值参数 ab?

注意:我不想在R代码中指定data.frame,这只是一个例子,它会被上传所以必须动态加载。

我不确定是否能很好地理解您的问题,但我认为您需要在服务器内而不是在 ui.

内使用您的 sliderInput

为此,您必须使用 renderUI() 和 UIOutput() 函数。你会有类似的东西:

在您的服务器中您将拥有:

UIOutput("mysliderinput")

在您的 ui 中您将拥有:

output$mysliderinput <- renderUI({
    sliderInput(inputId = 'num', label = "a", value = 1.5, min = 0, max = 5)
})

当然,您需要根据对数据框列的引用来调整值、最小值和最大值。

你可以参考这个:https://shiny.rstudio.com/reference/shiny/1.6.0/renderUI.html

希望这条线索对你有所帮助。

试试这个,

library(shiny)

ui <- fluidPage(
  fileInput("filename", "Choose CSV File", accept = ".csv"),
  tableOutput("contents"),
  sliderInput(inputId = 'num_1', label = "a", value = 1.5, min = 0, max = 5),
  sliderInput(inputId = 'num_2', label = "b", value = 3.5, min = 0, max = 5)
)

server <- function(input, output, session) {
  
  inputFile <- reactiveValues()
  
  observe({
    req(input$filename)
    inFile <- input$filename
    inputFile$data <- read.csv(inFile$datapath)
    inputFile$Slide1 <- unname(unlist(inputFile$data[1, 2:4]))
    inputFile$Slide2 <- unname(unlist(inputFile$data[2, 2:4]))
  })

  output$contents <- renderTable({
    inputFile$data
  })
  
  observe({
    req(inputFile$Slide1, inputFile$Slide2)
    updateSliderInput(session, "num_1", value = inputFile$Slide1[1],
                      min = inputFile$Slide1[2], max = inputFile$Slide1[3], step = 0.1)
    updateSliderInput(session, "num_2", value = inputFile$Slide2[1],
                      min = inputFile$Slide2[2], max = inputFile$Slide2[3], step = 0.1)
  })
  
}

shinyApp(ui, server)