问题很简单。首先,我在渲染图中尝试了if-else条件。像
这样的东西if (input$Next > 0) {
plot(...)
}
else {
return()
}
这没有用。即使尚未满足条件,也会显示稍后放置情节的灰色区域。 在下一步中,我尝试使用验证(请参阅here)。我基本上复制了给定示例中的代码。但是,当实际上不满足条件时,它仍然显示灰色区域。我目前的尝试如下:
ui.R
shinyUI(fluidPage(
sidebarPanel(
plotOutput("test"),
actionButton("Next", "Next")
))
server.R
shinyServer(function(input, output, session) {
function(input, output) {
output$test <- renderPlot({
validate(
need(input$Next > 0)
)
pt <- plot(input$Next,2)
print(pt)
})
}
})
绘图功能仅用于说明。我看起来不一样。任何帮助都非常感谢!
答案 0 :(得分:5)
conditionalPanel
如果按下plotOutput
,我们希望显示actionButton
。更具体地说,如果input.Next > 0
。此条件在javaScript
中进行评估,因此我们的语法略有不同 - 而不是$
我们在输入后使用.
并使用括号。
conditionalPanel(
condition = "input.Next * 1 > 0",
plotOutput("test")
)
但是,我们将input.Next
乘以1是很奇怪的。这是必要的,因为input.Next
,期望一个数字,也返回属性。似乎JavaScript不知道如何处理这个......但是乘法可以解决问题。
[1] 0
attr(,"class")
[1] "integer" "shinyActionButtonValue"
在此示例中,plotOutput
显示立即 ...绝对太快。
library(shiny)
ui1 <- shinyUI(fluidPage(
sidebarPanel(
conditionalPanel(
condition = "input.Next * 1 > 0",
plotOutput("test")
),
actionButton("Next", "Next")
)
))
server1 <- shinyServer(function(input, output, session) {
output$test <- renderPlot({
pt <- plot(input$Next, 2)
print(input$Next)
print(pt)
})
})
shinyApp(ui1, server1)
在这个例子中,我们将“减慢”超速plotOutput
。为此,我们需要包shinyjs
。
首先,我们要将conditionalPanel
打包成一个带有ID的div
,例如animation
div(id = "animation",
conditionalPanel(
condition = "input.Next * 1 > 0",
plotOutput("test")
)
)
然后,在服务器端,我们将以下列方式定义动画:条件输入$ next div应该显示幻灯片动画。
observe({
toggle(id = "animation", anim = TRUE, animType = "slide",
time = 0.5, condition = input$Next > 0)
})
完整示例:
ui2 <- shinyUI(fluidPage(
# we need to include this function in order to use shinyjs functions
useShinyjs(),
sidebarPanel(
actionButton("Next", "Next"),
div(id = "animation",
conditionalPanel(
condition = "input.Next * 1 > 0",
plotOutput("test"),
sliderInput("manipulate", "slider", min = 0, max = 1, value = 1)
)
)
)
))
server2 <- shinyServer(function(input, output, session) {
# Introduce gently the div with an id = "animation" and its all content.
observe({
toggle(id = "animation", anim = TRUE, animType = "slide",
time = 0.5, condition = input$Next > 0)
})
# We could animate only the plotOutput with "toogle(id = test")"
# - it would work as well, but for the first time the plot is shown
# way we would get an errors with margins.
output$test <- renderPlot({
#plot(input$Next, 2)
ggplot(iris, aes(x = Species)) + geom_bar(alpha = input$manipulate)
})
})
shinyApp(ui2, server2)
renderUI
正如您所指出的,另一种可能性是使用函数renderUI
。如果您想一次渲染多个元素,则必须将它们包装到list
中,如下例所示:
library(shiny)
library(ggplot2)
ui3 <- shinyUI(fluidPage(
sidebarPanel(
uiOutput("dynamic"),
actionButton("Next", "Next")
)
))
server3 <- shinyServer(function(input, output, session) {
output$dynamic <- renderUI({
if (input$Next > 0) {
# if we want to render more element, we need the list
list(
plotOutput("test"),
sliderInput("manipulate", "slider", min = 0, max = 1, value = 1)
)
}
})
output$test <- renderPlot({
#plot(input$Next, 2)
ggplot(iris, aes(x = Species)) + geom_bar(alpha = input$manipulate)
})
})
shinyApp(ui3, server3)
答案 1 :(得分:0)
使用条件面板如下:
library(shiny)
ui =fluidPage(
sidebarPanel(
conditionalPanel(condition="input.Next>0",
plotOutput("test")),
actionButton("Next", "Next")
))
server=shinyServer(function(input, output, session) {
output$test <- renderPlot({
req(input$Next > 0)
pt <- plot(input$Next,2)
print(pt)
})
})
shinyApp(ui=ui,server=server)