我有一个数据集,其中每一行都包含有关单个人的数据,每列包含有关他/她的不同信息。假设它看起来像这样(但实际数据中的列数和行数更多):
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'
,我希望在女性中有一个高度直方图。因为每个类别都有不同的值集,所以在更改类别后,我必须(自动)更新值选择器。 问题在于它意味着两个更新,每个更新都会生成新的直方图,而只有第二个更新。这是我的代码:
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"])
})
})
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
选择器?
答案 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的更多信息。