r-从服务器中的两个selectInputs中,如何使一个依赖于另一个



首先,如果帖子的主要问题(标题(不够清楚,我很抱歉。我不知道如何用我的问题来写问题。

问题是我有两个选择输入。主要的一个:数据集,有两个选项:1(汽车和2(虹膜。另一个选择输入,它有来自Cars数据集的信息和来自Iris数据集的数据。

如果我选择Cars,我需要显示Cars中的信息,如果我选择Iris,则需要显示Iris中的信息。

现在,我的代码无法做到这一点。简单地说,它会向您显示选择数据集的选项,但在第二个选择输入中,只显示来自Cars的信息。

我不知道怎么做,我已经发了很多帖子,但我无法得到我想要的。例如,这篇文章根据另一个selectInput的选择筛选一个selectedInput?非常相似,我想我可以做一些类似的事情,但他没有使用R…的数据集

我的代码:

library(shiny)
ui <- fluidPage(

titlePanel("Select a dataset"),

sidebarLayout(
sidebarPanel(
selectInput("dataset", "Dataset",
choices = c("Cars" = "Cars", "Iris" = "Iris")),
uiOutput("select_cars"),
uiOutput("select_iris")

),

mainPanel(
verbatimTextOutput("text"),
verbatimTextOutput("text2") 
)
)
)
server <- function(input, output) {

cars <- reactive({
data("mtcars")
cars <- rownames(mtcars)
return(cars)
})

iris <- reactive({
data("iris")
iris <- data.frame(unique(iris$Species))
colnames(iris) <- "iris"
return(iris)
})

output$select_cars <- renderUI({
selectInput(inputId = "options_cars", "Select one", choices = cars())
})
output$select_iris <- renderUI({
selectInput(inputId = "options_iris", "Select one iris", choices = iris())
})
output$text <- renderPrint(input$options_cars)
output$text2 <- renderPrint(input$options_iris)
}
#Run the app
shinyApp(ui = ui, server = server)

另一方面,我得到了一个错误:类型为"闭包"的对象是不可附属的但我不知道为什么。

最后,如果之前有人问过类似的问题,我很抱歉,我真的看了一上午,不知道该怎么解决。

提前非常感谢

问候

我修改了您的一些代码,并从shinyjs添加了一些JS功能,您可能会发现也可能不会发现有用的

  • 如果您只想更新列表,则不需要一直创建对象,因此我们将使用updateSelectInput来更新滑块
  • 我最初使用hidden功能来隐藏元素,使它们从一开始就不可见
  • 我在observeEvent中创建了对input$dataset的依赖,这样我们就可以更新滑块,并隐藏和显示我们不想要的滑块和我们不需要的输出
  • 此外,如果你的数据集是静态的,比如mtcarsiris,最好把它们放在server.R之外,这样你就不会做额外的不必要的工作
  • 最后,添加req总是一个好主意,这样如果它们是NULL,就不会创建任何对象
  • 您最初的错误是由于您将数据帧而不是列表或向量传递给滑块,如果您不确定,请尝试打印出对象并查看它们的类型

library(shiny)
library(shinyjs)
ui <- fluidPage(
titlePanel("Select a dataset"),
useShinyjs(),

sidebarLayout(
sidebarPanel(
selectInput("dataset", "Dataset",
choices = c("Cars" = "Cars", "Iris" = "Iris")),
hidden(selectInput(inputId = "options_cars", "Select one", choices = NULL)),
hidden(selectInput(inputId = "options_iris", "Select one iris", choices = NULL))

),
mainPanel(
verbatimTextOutput("text_cars"),
verbatimTextOutput("text_iris") 
)
)
)
cars_data <- unique(rownames(mtcars))
iris_data <-  as.character(unique(iris$Species))
server <- function(input, output, session) {

observeEvent(input$dataset,{
if(input$dataset == "Cars"){
show('options_cars')
hide('options_iris')
show('text_cars')
hide('text_iris')
updateSelectInput(session,"options_cars", "Select one", choices = cars_data)
}else{
show('options_iris')
hide('options_cars')
show('text_iris')
hide('text_cars')
updateSelectInput(session,"options_iris", "Select one iris", choices = iris_data)
}
})

output$text_cars <- renderPrint({
req(input$options_cars)
input$options_cars
})

output$text_iris <- renderPrint({
req(input$options_iris)
input$options_iris
})
}
#Run the app
shinyApp(ui = ui, server = server)

以下是允许selectInput切换的代码

library(shiny)
library(datasets)
ui <- fluidPage(

titlePanel("Select a dataset"),

sidebarLayout(
sidebarPanel(
selectInput("dataset", "Dataset",
choices = c("Cars" = "Cars", "Iris" = "Iris")),
##------removed this---------------
#  uiOutput("select_cars"),
#uiOutput("select_iris")
##------------------------------
uiOutput("select_by_input") 
),

mainPanel(
verbatimTextOutput("text")
# verbatimTextOutput("text2") 
)
)
)
server <- function(input, output) {

cars <- reactive({
data("mtcars")
cars <- rownames(mtcars)
return(cars)
})

iris <- reactive({
# data("iris")
# iris <- data.frame(unique(iris$Species))
data('iris')
#colnames(iris) <- "iris"
# iris_names <- as.character(unique(iris$Species) )
iris_names <- c('a','b','c')
return(iris_names)
})
##------removed this---------------  
# output$select_cars <- renderUI({
#   selectInput(inputId = "options_cars", "Select one", choices = cars())
# })
# 
# output$select_iris <- renderUI({
#   selectInput(inputId = "options_iris", "Select one iris", choices = iris())
# })
#-----------------------------  

output$select_by_input <- renderUI({
if (input$dataset=='Cars'){
selectInput(inputId = "options_x", "Select one", choices = cars())
}else if (input$dataset=='Iris'){
selectInput(inputId = "options_x", "Select one iris", choices = iris())
}

})

output$text <- renderPrint(input$options_x)
}
#Run the app
shinyApp(ui = ui, server = server)

CCD_ 13错误是由于运行应用程序后未加载CCD_。我用iris_names <- c('a','b','c')演示了selectInput的动态变化

最新更新