Debug shiny render* output












1















I'm trying to debug my shiny dashboard



For several render* function, I need to debug them with some log (with print or cat) but I can't use those function inside a renderDataTable() / renderText()



for example:



  output$selectedData = renderDataTable(
myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
)


I would like to print something to the console before and after the instruction of renderDataTable() but



  output$selectedData = renderDataTable(
cat("rendering...")
myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
cat("rendered")
)


How can I do this ?










share|improve this question



























    1















    I'm trying to debug my shiny dashboard



    For several render* function, I need to debug them with some log (with print or cat) but I can't use those function inside a renderDataTable() / renderText()



    for example:



      output$selectedData = renderDataTable(
    myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
    )


    I would like to print something to the console before and after the instruction of renderDataTable() but



      output$selectedData = renderDataTable(
    cat("rendering...")
    myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
    cat("rendered")
    )


    How can I do this ?










    share|improve this question

























      1












      1








      1








      I'm trying to debug my shiny dashboard



      For several render* function, I need to debug them with some log (with print or cat) but I can't use those function inside a renderDataTable() / renderText()



      for example:



        output$selectedData = renderDataTable(
      myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
      )


      I would like to print something to the console before and after the instruction of renderDataTable() but



        output$selectedData = renderDataTable(
      cat("rendering...")
      myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
      cat("rendered")
      )


      How can I do this ?










      share|improve this question














      I'm trying to debug my shiny dashboard



      For several render* function, I need to debug them with some log (with print or cat) but I can't use those function inside a renderDataTable() / renderText()



      for example:



        output$selectedData = renderDataTable(
      myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
      )


      I would like to print something to the console before and after the instruction of renderDataTable() but



        output$selectedData = renderDataTable(
      cat("rendering...")
      myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]
      cat("rendered")
      )


      How can I do this ?







      r debugging shiny






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 14 '18 at 14:58









      SerkSerk

      588




      588
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Here is a possible solution to the problem. First I use a variable called data to assingn any calculations to, in your case
          data<-myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]. This is used inside the render function and will be created when the output is rendered since it relies on this. I then use an observe function that requires the variable data to be created before printing the second "rendered" to the console. That works once on startup, and will work fine if your data is constant. If you have changing data, for my example the data changes with a user selection, we will have to re-render the table. Since the render function is reactive and you are using input$process_tokens, the render function will re-run when the input changes. In this example it runs when input$select changes. When it runs it resets the variable data to NULL, and we trigger a separate observeEvent that monitors changes to input$select(input$process_tokens). This observeEvent also requires data before continuing, and since the render function set it to null it will not print the second "rendered" until data is created, just as in the first case.



          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)


          Specific code for you:



          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)


          Note that you will get two "rendered" printouts when the program initially starts, this is b/c both the observe and observeEvent run since both conditions are met. If your data does change with input$process_tokens, then you can get rid of the observe function, and only use the observeEvent. If your data does not change and the table is only rendered once, then get rid of the observeEvent. I was trying to cover all bases.






          share|improve this answer





















          • 1





            Thanks a lot ! This solved my issue

            – Serk
            Nov 14 '18 at 16:34











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53303085%2fdebug-shiny-render-output%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          Here is a possible solution to the problem. First I use a variable called data to assingn any calculations to, in your case
          data<-myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]. This is used inside the render function and will be created when the output is rendered since it relies on this. I then use an observe function that requires the variable data to be created before printing the second "rendered" to the console. That works once on startup, and will work fine if your data is constant. If you have changing data, for my example the data changes with a user selection, we will have to re-render the table. Since the render function is reactive and you are using input$process_tokens, the render function will re-run when the input changes. In this example it runs when input$select changes. When it runs it resets the variable data to NULL, and we trigger a separate observeEvent that monitors changes to input$select(input$process_tokens). This observeEvent also requires data before continuing, and since the render function set it to null it will not print the second "rendered" until data is created, just as in the first case.



          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)


          Specific code for you:



          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)


          Note that you will get two "rendered" printouts when the program initially starts, this is b/c both the observe and observeEvent run since both conditions are met. If your data does change with input$process_tokens, then you can get rid of the observe function, and only use the observeEvent. If your data does not change and the table is only rendered once, then get rid of the observeEvent. I was trying to cover all bases.






          share|improve this answer





















          • 1





            Thanks a lot ! This solved my issue

            – Serk
            Nov 14 '18 at 16:34
















          1














          Here is a possible solution to the problem. First I use a variable called data to assingn any calculations to, in your case
          data<-myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]. This is used inside the render function and will be created when the output is rendered since it relies on this. I then use an observe function that requires the variable data to be created before printing the second "rendered" to the console. That works once on startup, and will work fine if your data is constant. If you have changing data, for my example the data changes with a user selection, we will have to re-render the table. Since the render function is reactive and you are using input$process_tokens, the render function will re-run when the input changes. In this example it runs when input$select changes. When it runs it resets the variable data to NULL, and we trigger a separate observeEvent that monitors changes to input$select(input$process_tokens). This observeEvent also requires data before continuing, and since the render function set it to null it will not print the second "rendered" until data is created, just as in the first case.



          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)


          Specific code for you:



          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)


          Note that you will get two "rendered" printouts when the program initially starts, this is b/c both the observe and observeEvent run since both conditions are met. If your data does change with input$process_tokens, then you can get rid of the observe function, and only use the observeEvent. If your data does not change and the table is only rendered once, then get rid of the observeEvent. I was trying to cover all bases.






          share|improve this answer





















          • 1





            Thanks a lot ! This solved my issue

            – Serk
            Nov 14 '18 at 16:34














          1












          1








          1







          Here is a possible solution to the problem. First I use a variable called data to assingn any calculations to, in your case
          data<-myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]. This is used inside the render function and will be created when the output is rendered since it relies on this. I then use an observe function that requires the variable data to be created before printing the second "rendered" to the console. That works once on startup, and will work fine if your data is constant. If you have changing data, for my example the data changes with a user selection, we will have to re-render the table. Since the render function is reactive and you are using input$process_tokens, the render function will re-run when the input changes. In this example it runs when input$select changes. When it runs it resets the variable data to NULL, and we trigger a separate observeEvent that monitors changes to input$select(input$process_tokens). This observeEvent also requires data before continuing, and since the render function set it to null it will not print the second "rendered" until data is created, just as in the first case.



          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)


          Specific code for you:



          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)


          Note that you will get two "rendered" printouts when the program initially starts, this is b/c both the observe and observeEvent run since both conditions are met. If your data does change with input$process_tokens, then you can get rid of the observe function, and only use the observeEvent. If your data does not change and the table is only rendered once, then get rid of the observeEvent. I was trying to cover all bases.






          share|improve this answer















          Here is a possible solution to the problem. First I use a variable called data to assingn any calculations to, in your case
          data<-myCsv[which(myCsv[[myCase_id]]==input$process_tokens),]. This is used inside the render function and will be created when the output is rendered since it relies on this. I then use an observe function that requires the variable data to be created before printing the second "rendered" to the console. That works once on startup, and will work fine if your data is constant. If you have changing data, for my example the data changes with a user selection, we will have to re-render the table. Since the render function is reactive and you are using input$process_tokens, the render function will re-run when the input changes. In this example it runs when input$select changes. When it runs it resets the variable data to NULL, and we trigger a separate observeEvent that monitors changes to input$select(input$process_tokens). This observeEvent also requires data before continuing, and since the render function set it to null it will not print the second "rendered" until data is created, just as in the first case.



          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)


          Specific code for you:



          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)


          Note that you will get two "rendered" printouts when the program initially starts, this is b/c both the observe and observeEvent run since both conditions are met. If your data does change with input$process_tokens, then you can get rid of the observe function, and only use the observeEvent. If your data does not change and the table is only rendered once, then get rid of the observeEvent. I was trying to cover all bases.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 14 '18 at 16:25

























          answered Nov 14 '18 at 15:50









          ChaboChabo

          1,0401619




          1,0401619








          • 1





            Thanks a lot ! This solved my issue

            – Serk
            Nov 14 '18 at 16:34














          • 1





            Thanks a lot ! This solved my issue

            – Serk
            Nov 14 '18 at 16:34








          1




          1





          Thanks a lot ! This solved my issue

          – Serk
          Nov 14 '18 at 16:34





          Thanks a lot ! This solved my issue

          – Serk
          Nov 14 '18 at 16:34




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53303085%2fdebug-shiny-render-output%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Florida Star v. B. J. F.

          Danny Elfman

          Lugert, Oklahoma