shiny中的conditionalPanel:基于数据集中变量类的条件

时间:2017-03-20 07:34:18

标签: javascript r shiny

我正在构建一个Shiny应用程序,其中包含用于映射/可视化来自特定数据集的数据的各种选项。我有一个selectInput,用户从他们想要显示的数据集中选择变量。

我希望在用户仅选择数字变量时显示conditionalPanel

我确定它很简单,但我在编写conditionalPanel的条件参数时遇到了麻烦,因为我不熟悉Javascript。在R语言中,我可以使用is.numeric(),但我不熟悉如何在Javascript中执行此操作。我已经尝试了condition = "isNaN(input.variables) == FALSE",但我认为这只是测试变量的名称是否为数字,而不是其中的数据。

我知道我可以根据this tutorial使用服务器端的反应式表达式在R中编写一个条件,但是我宁愿避免它,因为它的计算量更大密集的。

非常感谢任何帮助!

以下示例代码。要清楚,单选按钮应仅在" nums"变量被选中(包含数字数据)但不是当"字母"变量被选中。

letters <- c("a","b","c")
nums <- 1:3
dat <- data.frame(letters,nums)

ui <- fluidPage(
  sidebarPanel(
    selectInput("variables", h4("Pick variable to plot:"), choices = colnames(dat)),
    conditionalPanel( 
      condition = "isNaN(input.variables) == FALSE",
      radioButtons("seq_div", "Colours should be...", c("sequential", "divergent"))
    )
  ),
  mainPanel()
)

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

如果您事先并不知道哪些列是数字的(我认为这是这种情况),您可以这样做:

letters <- c("a","b","c")
nums <- 1:3
num2 <- 4:6
dat <- data.frame(letters,nums, num2)

numeric_cols = paste("'",colnames(dat)[sapply(dat, is.numeric)],"'", collapse = ',', sep = '')

ui <- fluidPage(
    sidebarPanel(
        selectInput("variables", h4("Pick variable to plot:"), choices = colnames(dat)),
        conditionalPanel( 
            condition = paste0("[", numeric_cols, "].indexOf(input.variables) >= 0"),
            radioButtons("seq_div", "Colours should be...", c("sequential", "divergent"))
        )
    ),
    mainPanel()
)

server <- shinyServer(function(input, output) {
})

shinyApp(ui = ui, server = server)

它基本上找到哪些列是数字,将它们粘贴到JS数组表单中,然后检查所选项是否在该数组中。