R中有光泽:如果不满足某些条件,我怎样才能从renderPlot淡出我的plotOutput?

时间:2016-07-20 08:55:22

标签: r shiny

问题很简单。首先,我在渲染图中尝试了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)
  })
}
})

绘图功能仅用于说明。我看起来不一样。任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:5)

  1. 第一种可能性 - conditionalPanel
  2. 如果按下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)
    
    1. "Slowing down the train"
    2. 在这个例子中,我们将“减慢”超速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)
      
      1. renderUI
      2. 正如您所指出的,另一种可能性是使用函数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)