【发布时间】:2017-10-19 21:21:06
【问题描述】:
我有一个闪亮的应用程序,我想在数据框上构建一个条件查询系统。
首先,我想要一个显示所有可用表的 selectInput。用户选择表后,我希望出现另一个框,他可以在其中选择要过滤的列名。这是我到目前为止所拥有的:
ui.r:
library(shiny)
library(shinydashboard)
source("global_variables.r")
ui=dashboardPage(
dashboardHeader(title="Test"),
dashboardSidebar(
sidebarMenu(
menuItem("Conditionals",tabName = "conditionals")
)
),
dashboardBody(
tabItems(
tabItem(tabName="conditionals",
fluidRow(
box(
title = "Conditionals",
width = 4,
selectInput("Con_tableName",choices=c("NONE",tableNames),label = "Table Name"),
tags$div(id = 'placeholder')
)
)
)
)
)
)
server.r:
library(shiny)
source("global_variables.r", local = FALSE)
Table1=data.frame();
shinyServer(
function(input, output,session) {
observe({
reactive(
if(input$Con_tableName!="NONE"){
insertUI( selector="#placeholder",
ui={
selectInput("Con_colName",choices=c("NONE",colnames(dynGet(input$Con_tableName))),label = "Column Name")
}
)
}
)
})
}
)
global_variables.r:
tableNames=c("Table1","Table2","Table3")
问题是,如果我在 selectInput 中选择一个值,observe 不会被触发。
编辑:
根据 BigDataScientists 的评论,将insertUI 更改为renderUI。更新文件:
ui.r:
library(shiny)
library(shinydashboard)
source("global_variables.r")
ui=dashboardPage(
dashboardHeader(title="Test"),
dashboardSidebar(
sidebarMenu(
menuItem("Conditionals",tabName = "conditionals")
)
),
dashboardBody(
tabItems(
tabItem(tabName="conditionals",
fluidRow(
box(
title = "Conditionals",
width = 4,
selectInput("Con_tableName",choices=c("NONE",tableNames),label = "Table Name"),
uiOutput("conditionalUI")
)
)
)
)
)
)
server.r:
library(shiny)
source("global_variables.r", local = FALSE)
Table1=data.frame();
shinyServer(
function(input, output,session) {
observeEvent(input$Con_tableName,{
reactive(
if(input$Con_tableName!="NONE"){
output$conditionalUI=renderUI({
selectInput("Con_colName",choices=c("NONE",colnames(input$Con_tableName)),label = "Column Name")
})
}
)
})
}
)
【问题讨论】:
-
我会使用
renderUI()而不是insertUI(),因为您将在第一个 selectInput 更改时创建新元素...... -
感谢您的快速回答!我改变了这个,但我仍然有同样的问题。该事件仍未触发
-
你能分享编辑吗,...
-
给你。再次感谢您的快速帮助!
-
给我错误,对不起,...也许它适用于其他 smdy