调试闪亮的渲染*输出

时间:2018-11-14 14:58:51

标签: r debugging shiny

我正在尝试调试闪亮的仪表板

对于多个render *函数,我需要使用一些日志(带有print或cat)来调试它们,但不能在optimizer.step() / renderDataTable()

中使用这些函数。

例如:

renderText()

我想在 output$selectedData = renderDataTable( myCsv[which(myCsv[[myCase_id]]==input$process_tokens),] ) 之前和之后向控制台打印一些内容,但

renderDataTable()

我该怎么做?

1 个答案:

答案 0 :(得分:1)

这是解决该问题的可能方法。首先,在您的情况下,我使用一个名为data的变量将所有计算分配给 data<-myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]。它在render函数内使用,由于依赖于此,因此将在渲染输出时创建。然后,我使用一个观察函数,该函数需要在将第二个data打印到控制台之前创建变量"rendered"。该功能在启动后即可运行,并且如果您的数据恒定,则可以正常运行。如果您有更改的数据,以我的示例为例,数据随用户选择而更改,那么我们将不得不重新呈现该表。由于渲染功能是反应式的,并且您正在使用input $ process_tokens,因此当输入更改时,渲染功能将重新运行。在此示例中,它在input$select更改时运行。当它运行时,它将变量data重置为NULL,并且我们触发了一个单独的observeEvent来监视对input $ select(input $ process_tokens)的更改。 observeEvent还在继续之前需要数据,并且由于render函数将其设置为null,因此在创建数据之前不会打印第二个“ rendered”,就像在第一种情况下一样。

library(shiny)
library(DT)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
  selectizeInput("select","select",choices=(c(1,2,3,4)))
    ),
  mainPanel(
   dataTableOutput("selectedData")
  )

))

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

  data<-reactive({data.frame(input$select,4,5)})

  output$selectedData <- renderDataTable({
    data<-NULL
    print("rendering..")
    data<-datatable(data())
  })

  #Observe inital rendering (only needed if no change to data)
  observe({
    req(data)
    print("rendered!")
    })

  #Observe Changes to data
  observeEvent(input$select,{
    req(data)
    print("rendered!")
  })
}

shinyApp(ui, server)

为您提供的特定代码:

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

      output$selectedData <- renderDataTable({
        data<-NULL
        print("rendering..")
        data<- myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
      })

      #Observe inital rendering (only needed if no change to data)
      observe({
        req(data)
        print("rendered!")
        })

      #Observe Changes to data
      observeEvent(input$process_tokens,{
        req(data)
        print("rendered!")
      })
    }

    shinyApp(ui, server)

请注意,当程序最初启动时,您将获得两个“渲染的”打印输出,因为同时满足这两个条件,所以这将同时运行observe和observeEvent。如果您的数据确实随着input$process_tokens发生了变化,那么您就可以摆脱observe函数,而仅使用observeEvent。如果您的数据没有更改,并且该表仅呈现一次,那么请摆脱observeEvent。我试图涵盖所有基础。