使用选择结果设置第二个条件选择输入的选项(R)

使用选择结果设置第二个条件选择输入的选项(R),r,shiny,R,Shiny,我试图制作一个闪亮的工具,根据日期框的选择创建直方图,然后在数据框中创建列。但是,我很难让UI从选定的数据帧中读取列,然后显示列选项以供选择 例如,我们有两列cl1和cl2的DataFrameA,然后是列clx、cly、clz的DataFrameB。如果我选择DataFrameA,下一个selectInput ui应该允许我选择列cl!或者cl2,如果我选择了DataFrameB,它会给我clx、cly、clz的选项 ui = fluidPage( selectInput(inputI

我试图制作一个闪亮的工具,根据日期框的选择创建直方图,然后在数据框中创建列。但是,我很难让UI从选定的数据帧中读取列,然后显示列选项以供选择

例如,我们有两列cl1和cl2的DataFrameA,然后是列clx、cly、clz的DataFrameB。如果我选择DataFrameA,下一个selectInput ui应该允许我选择列cl!或者cl2,如果我选择了DataFrameB,它会给我clx、cly、clz的选项

ui = fluidPage(
     selectInput(inputId = "dataFrame",
          label = "Select Dataframe",
          choices = names(which(unlist(eapply(.GlobalEnv,is.data.frame))))
          ),

  #This is where I get fudged, I want the dataframe name to have been read 
  #in the server now, and used to select the column names so I can now 
  #display them as select options. 

  conditionalPanel(condition = "output.columnChoices",
               selectInput(inputId = "dataColumn",
                           label = "Choose Column:",
                           choices = "output.columnChoices")
               )
  )

 server <- function(input,output) {

 #To my understanding this should reactively read in the dataframe name
 #selected and output the list of column names for that dataframe.

 output$columnChoices <- reactive({
    colnames(input$DataFrame)
 })

 outputOptions(output, "columnChoices", suspendWhenHidden = FALSE)  

 }

shinyApp(ui, server)
当我运行它时,它看起来几乎产生了两个选项,然后立即转移到只有dataframe输入选项。有什么建议吗?最后,我想根据列选择生成一个直方图,但我需要先弄清楚这一点。

您可以使用

UIO输出

您可以将uiOutputui_id放置在ui部分,并使用output$ui_id从服务器创建任何您想要的内容。您可以使用updateSelectInput使用新列名更新输入,还可以使用get从环境中获取数据帧

工作示例:

A = data.frame(a=letters[1:5],b=letters[6:10],c=letters[11:15])
B = data.frame(x=LETTERS[1:5],y=LETTERS[6:10],z=LETTERS[11:15])

library(shiny)

ui = fluidPage(
  selectInput(inputId = "dataFrame",
              label = "Select Dataframe",
              choices = names(which(unlist(eapply(.GlobalEnv,is.data.frame))))
  ),
  selectInput(inputId = "dataColumn",
              label = "Choose Column:",
              choices = NULL),
  textOutput('test')
)

server <- function(input,output,session) {

  observeEvent(input$dataFrame,{
    updateSelectInput(session,'dataColumn',choices = colnames(get(input$dataFrame)))
  })

  output$test = renderText({
    df = get(input$dataFrame)
    text = paste(df[[input$dataColumn]],sep=', ')
  })
}

shinyApp(ui, server)

希望这有帮助

我仍然只得到第一个输入选择选项。它编译没有错误,即使在我简单地输入了直接虚拟变量的情况下,第二个selectInput也不会出现在ui中。第二个选项工作得很好,谢谢!我确实想让它变得灵活,这样就不必在每个数据帧中手动编写列表代码,但我可以从我的角度解决这个问题。
   switch(
      input$dataFrame,
      "test1" = test1,
      "test2" = test2)
A = data.frame(a=letters[1:5],b=letters[6:10],c=letters[11:15])
B = data.frame(x=LETTERS[1:5],y=LETTERS[6:10],z=LETTERS[11:15])

library(shiny)

ui = fluidPage(
  selectInput(inputId = "dataFrame",
              label = "Select Dataframe",
              choices = names(which(unlist(eapply(.GlobalEnv,is.data.frame))))
  ),
  selectInput(inputId = "dataColumn",
              label = "Choose Column:",
              choices = NULL),
  textOutput('test')
)

server <- function(input,output,session) {

  observeEvent(input$dataFrame,{
    updateSelectInput(session,'dataColumn',choices = colnames(get(input$dataFrame)))
  })

  output$test = renderText({
    df = get(input$dataFrame)
    text = paste(df[[input$dataColumn]],sep=', ')
  })
}

shinyApp(ui, server)
A = data.frame(a=letters[1:5],b=letters[6:10],c=letters[11:15])
B = data.frame(x=LETTERS[1:5],y=LETTERS[6:10],z=LETTERS[11:15])
my_dfs = list(A=A,B=B)

library(shiny)

ui = fluidPage(
  selectInput(inputId = "dataFrame",
              label = "Select Dataframe",
              choices = names(my_dfs)
  ),
  selectInput(inputId = "dataColumn",
              label = "Choose Column:",
              choices = NULL),
  textOutput('test')
)

server <- function(input,output,session) {

  observeEvent(input$dataFrame,{
    updateSelectInput(session,'dataColumn',choices = colnames(my_dfs[[input$dataFrame]]))
  })

  output$test = renderText({
    df = my_dfs[[input$dataFrame]]
    text = paste(df[[input$dataColumn]],sep=', ')
  })
}

shinyApp(ui, server)