【问题标题】:How to automatically collapse code in RShiny app server (reactives, renders, etc)如何在 R Shiny 应用服务器中自动折叠代码(反应、渲染等)
【发布时间】:2021-05-27 12:26:51
【问题描述】:

我正在使用一个非常大的 RShiny 应用程序,并希望利用代码折叠来组织此应用程序中的 server.R 文件。但是,当我使用代码折叠热键时,它不会折叠服务器中定义的各种元素(反应、渲染等元素)。

我希望能够接受这个

# observe some things
observe({
  query <- parseQueryString(session$clientData$url_search)
  if (!is.null(query[['tab']])) {
    updateTabItems(session, "sidebarMenu", selected = query[['tab']])
  }
  if (!is.null(query[['player']])) {
    updateSelectInput(session, "profile", selected = query[['player']])
  }
})


# Lots of "reactive" data fetching functions 
league_stats <- reactive({
  get1 <- fetch('yada')  
  return(get1)
})

# another reactive
shooting <- reactive({
  get1$SHORT_MR_MADE<-sum(get1$short_mr_fgm,na.rm=T)
  ...
  ...
)}

只需点击代码折叠热键即可将其折叠成这个(或类似的东西)。

# observe some things
observe({--})

# Lots of "reactive" data fetching functions 
league_stats <- reactive({--})

# another reactive
shooting <- reactive({--})

这可能与 R / RStudio 相关吗?我想避免使用函数上方的 4 # 符号 #### 来编码折叠,因为这也会隐藏 shooting &lt;- reactive({--}) 字符串,但是我仍然希望显示(并且只是隐藏代码里面)。

由于函数崩溃,我经常将代码包装在函数中,但是我无法将 RShiny 反应元素包装在函数中(或者,我不确定如何),因为这似乎会破坏应用程序。

【问题讨论】:

    标签: r shiny rstudio code-folding


    【解决方案1】:

    Shiny reactive 的行为与其他函数一样,但您需要注意将inputsession 或其他reactives(作为function,而不是作为值)传递给它们。

    作为说明:

    library(shiny)
    
    generateUI <- function() {fluidPage(
      actionButton("do", "Click Me"),
      textOutput('counter')
    )}
    
    ui <- generateUI()
    
    myobserver <- function(input,counter) {
      observeEvent(input$do, {
        cat('Clicked \n')
        counter(counter()+1)
      })
    }
    
    myformater <- function(counter) {
      renderText(paste('count is',counter()))
    }
    
    server <- function(input, output, session) {
      counter <- reactiveVal(0)
      myobserver(input,counter)
      output$counter <- myformater(counter)
    }
    
    shinyApp(ui, server)
    

    折叠代码:

    【讨论】:

      【解决方案2】:

      另一种不将它们创建为函数的方法是在每个代码块上方放置一个标识符:

      library(shiny)
      # Generate UI ----
      generateUI <- function() {fluidPage(
        actionButton("do", "Click Me"),
        textOutput('counter')
      )}
      
      ui <- generateUI()
      
      # Observer ----
      myobserver <- function(input,counter) {
        observeEvent(input$do, {
          cat('Clicked \n')
          counter(counter()+1)
        })
      }
      
      # Formatter ----
      myformater <- function(counter) {
        renderText(paste('count is',counter()))
      }
      
      # Server ----
      server <- function(input, output, session) {
        counter <- reactiveVal(0)
        myobserver(input,counter)
        output$counter <- myformater(counter)
      }
      
      shinyApp(ui, server)
      

      您将能够折叠两个标识符之间的代码段以查看如下所示:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-28
        • 2021-10-26
        • 2017-01-14
        • 2014-12-20
        • 2019-02-09
        • 2018-10-02
        • 2017-01-15
        相关资源
        最近更新 更多