从 R Shiny 中为 SliderInput 参数上传的 CSV 文件访问数据框的元素
Access elements of dataframe from uploaded CSV file in R Shiny for SliderInput arguments
我想将 CSV 文件上传到 Shiny 应用程序,并为 value
、min
和 max
更新 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)
在为 value
、min
和 max
列上传 CSV 文件后,如何使 sliderInput
参数更新为这些值参数 a
和 b
?
注意:我不想在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)
我想将 CSV 文件上传到 Shiny 应用程序,并为 value
、min
和 max
更新 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)
在为 value
、min
和 max
列上传 CSV 文件后,如何使 sliderInput
参数更新为这些值参数 a
和 b
?
注意:我不想在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)