【问题标题】:Shiny in R: How to properly use reactive, observe and renderUI?Shiny in R:如何正确使用响应式、观察和渲染 UI?
【发布时间】:2016-09-02 08:18:27
【问题描述】:

我的代码有问题。每次我点击一个按钮时,我的情节(用 ggvis 构建)都会出现,但会立即消失。由于我的代码很长,下面的代码重现了我的问题。我想在我的渲染函数中重用反应数据帧 test0,我想这正是导致我的问题的原因。但这对我来说是必不可少的。这三个步骤(反应、观察、渲染)与我的代码相同。非常感谢您的帮助!

server.R

library(shiny)
library(ggvis)
library(dplyr)

data(mtcars)

shinyServer(function(input, output) {

test0 <- reactive({
  df <- mtcars %>% select(mpg, wt)
  (input$NextCounter + 1)*df
})

observe({
  df <- test0()
  if (!is.null(df)) {
     ggvis(df, x = ~wt, y = ~mpg) %>% bind_shiny("plotggvis")
  }
})

output$test1 <- renderUI({
  df <- test0()
  ggvisOutput("plotggvis")
})

})

ui.R

图书馆(闪亮)

shinyUI(fluidPage(

 sidebarLayout(
  sidebarPanel(

   actionButton("NextCounter", "Next")
  ),

  mainPanel(
   uiOutput("test1")
 )
)
))

【问题讨论】:

  • ggvisOutput 应该在 UI 端
  • @s.brunel 感谢您的评论!所以你的意思是,将 ggvisOutput 放在 UI 中可以解决整个问题?但这是唯一的解决方案吗?由于布局原因,有时在服务器中创建整个输出很重要...
  • 你可以检查这个stackoverflow.com/questions/25088248/…它应该有帮助
  • 这很有帮助 - 非常感谢!但是还是很可惜,没有解决方案,让一切都可以在服务端做。

标签: r shiny ggvis


【解决方案1】:

这个为我工作

library(shiny)
library(ggvis)
library(dplyr)


ui <- shinyUI(fluidPage(

sidebarLayout(
sidebarPanel(

  actionButton("NextCounter", "Next")
),

    mainPanel(
    ggvisOutput("plotggvis")
    )
  )
        ))

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

  data(mtcars)

  test0 <- reactive({
df <- mtcars %>% select(mpg, wt)
(input$NextCounter + 1)*df
  })


  my_graph <- reactive({
    df <- test0()
    ggvis(df, x = ~wt, y = ~mpg) 

})

  my_graph %>% bind_shiny("plotggvis") 

  })

})



shinyApp(ui = ui, server = server)

【讨论】:

    【解决方案2】:

    您无需在 UI 中使用ggvisOutput 即可解决您的问题。实际上,您的代码中的问题是在观察者中有 bind_shiny 函数,每次您的 test0 数据更改时都会再次执行该函数。预计只会绑定一次您的 ggvis,否则它将具有出现并立即消失的行为。此外,ggvis 的一个重要特性是在数据发生变化时具有良好的过渡效果,因此您无需在每次数据更改时都创建 ggvis 对象,只需确保在 UI 中只绑定该 ggvis 对象一次。

    以下是您的代码的修改版本,用于解决您的问题并显示数据的动画转换。

    library(shiny)
    library(ggvis)
    library(dplyr)
    
    data(mtcars)
    
    ui <- fluidPage(fluidPage(
      sidebarLayout(
        sidebarPanel(
          actionButton("NextCounter", "Next")
        ),
        mainPanel(
          uiOutput("test1")
        )
      )
    ))
    
    server <- function(input, output) {
      test0 <- reactive({
        input$NextCounter
        df <- mtcars %>% select(mpg, wt)
        df[sample(nrow(df),nrow(df)/2), ]
      })
      output$test1 <- renderUI({
        # bind the ggvis only once
        test0 %>% ggvis(x = ~wt, y = ~mpg) %>% bind_shiny("plotggvis")
        ggvisOutput("plotggvis")
      })
    }
    
    shinyApp(ui, server)
    

    您还可以使用输入小部件修改一些 ggvis 参数,方法是将ggvis 放在反应式表达式中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 2019-04-26
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2021-03-20
      相关资源
      最近更新 更多