我正在尝试调试闪亮的仪表板
对于多个render *函数,我需要使用一些日志(带有print或cat)来调试它们,但不能在optimizer.step()
/ renderDataTable()
例如:
renderText()
我想在 output$selectedData = renderDataTable(
myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
)
之前和之后向控制台打印一些内容,但
renderDataTable()
我该怎么做?
答案 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。我试图涵盖所有基础。