R Shiny:如何使用嵌套选择器防止重复绘图更新?

时间:2015-07-23 17:17:23

标签: r shiny

我有一个数据集,其中每一行都包含有关单个人的数据,每列包含有关他/她的不同信息。假设它看起来像这样(但实际数据中的列数和行数更多):

data <- data.frame(
  height=runif(1000, 150, 200),
  sex=sample(c("f","m"), 1000, replace=T),
  heir=sample(c("blond", "black", "red", "brown"), 1000, replace=T),
  eye=sample(c("blue", "green", "brown"to show histograms ), 1000, replace=T)
)

我想创建一个Shiny应用程序,我可以在其中选择一个类别(列)和一个值,并在共享此值的人中绘制height的直方图。例如,对于category = 'sex'value = 'f',我希望在女性中有一个高度直方图。因为每个类别都有不同的值集,所以在更改类别后,我必须(自动)更新值选择器。 问题在于它意味着两个更新,每个更新都会生成新的直方图,而只有第二个更新。这是我的代码:

server.R

shinyServer(function(input, output, session) {

  data <- data.frame(
    height=runif(1000, 150, 200),
    sex=sample(c("f","m"), 1000, replace=T),
    heir=sample(c("blond", "black", "red", "brown"), 1000, replace=T),
    eye=sample(c("blue", "green", "brown"), 1000, replace=T)
    )

  # update value after category change
  observe({
    updateSelectInput(session, "value", "Value",
                      choices=as.list(levels(data[,input$category])))
    cat(paste("category update:",input$category, "\n"), file = stderr())
  })

  output$histogram <- renderPlot({
    cat(paste("hist:", "category =", input$category,
              "value =",input$value, "\n"), file = stderr())
    hist(data[data[, input$category] == input$value, "height"])
  })
})

ui.R

shinyUI(fluidPage(
  sidebarPanel(    
    selectInput("category", "Category", choices=c("sex", "heir", "eye"), selected="sex"),
    selectInput("value", "Value", c("f", "m"), selected="f")
  ),

  mainPanel(
    plotOutput("histogram")
  )
))

cat表达式可以更轻松地查看正在发生的事情。当我运行应用程序时,选择默认类别('性别')和值('f'),因此控制台输出为:

category update: sex 
hist: category = sex value = f 

然后,当我使用选择器选择不同的类别时,例如继承人,我得到了一个信息:

category update: heir 
hist: category = heir value = f 
Error in hist.default(data[data[, input$category] == input$value, "height"]): 
  invalid number of 'breaks'
hist: category = heir value = black 

因此,首先,应用程序会更改类别并尝试为新category = heir和旧value = f绘制直方图,这当然必须失败。只有这样它才会改变value,然后绘制正确的直方图。 有没有办法在绘制任何绘图之前自动更新value选择器?

1 个答案:

答案 0 :(得分:2)

您可以使用isolate来避免直方图与input$category

的相关性
  output$histogram <- renderPlot({
    cat(paste("hist:", "category =", isolate(input$category),
              "value =",input$value, "\n"), file = stderr())
    hist(data[data[, isolate(input$category)] == input$value, "height"])
  })

类别更改时,您的直方图将不再更新。更改类别也会更改应用程序中的值,并且直方图将在更改该值时更新。

有关isolate here的更多信息。