R - Shiny Data Table (renderDataTable) reloads to first page when user is on a different page and updates a...











up vote
2
down vote

favorite
1












PROBLEM: R Shiny Data Table reloads to the first page whenever user is on a different page of the data table and updates a certain column value (via selectInput).



Hi Stack Users,



In R Shiny, I've created a Shiny application that contains a data table (renderDataTable) where a cell value of column "status" can be updated (via selectInput) by its intended users.



I've prepared a simplified sample of the code below.



ui.R



require(shiny)
require(shinydashboard)
require(shinyjs)
require(data.table)
require(dplyr)
require(DT)
require(htmltools)

shinyUI(fluidPage(
useShinyjs(),
mainPanel("",
fluidRow(
splitLayout(#cellWidths = c("110%", "40%"),
div(DT::dataTableOutput('my_table')),
div(
shinyjs::hidden(
wellPanel(id="my_panel",
h3("Update Status",align="center"),
htmlOutput("my_status")
)
)
)
)
)
)
))


server.R



#### DATA PREP AND FUNCTIONS ######################
id <- c('10001','10002','10003','10004','10005',
'10006','10007','10008','10009','10010',
'10011','10012','10013','10014','10015')
status <- c('NEW','PENDING','SOLVED','CLOSED','NEW',
'PENDING','SOLVED','CLOSED','NEW','PENDING',
'SOLVED','CLOSED','NEW','PENDING','SOLVED')
owner <- c('Alice','Bob','Carol','Dave','Me',
'Carol','Bob','Dave','Me','Alice',
'Me','Dave','Bob','Alice','Carol')

dt <- data.table(id=id,status=status)
st <- data.table(id=id,status=status,owner=owner)

render_my_table <- function(dt, sel) {
if(missing(sel)) {
sel = list(mode='single')
} else {
sel = list(mode='single', selected = sel)
}
return (DT::datatable(dt[, list("ID" = id, "Status"=status)],
selection = sel, filter="top",
options = list(sDom = '<"top">lrt<"bottom">ip',
lengthChange = FALSE,
pageLength = 5))) %>% formatStyle(
'Status',
target = 'row',
backgroundColor = styleEqual(c('NEW', 'PENDING', 'SOLVED', 'CLOSED'), c('white', 'yellow', 'dodgerblue', 'green'))
)
}

get_user_ses <- function() {
return ("Me")
}


change_status <- function(s_id, s, user, new_dt) {
if(!(s %in% c('NEW', 'PENDING', 'FRAUD', 'SOLVED', 'CLOSED'))) {
return (new_dt)
}
st = st
if(nrow(st[id == s_id]) == 0) {
st = rbind(st, data.table("id" = c(s_id), "status" = c(s), "owner" = c(ifelse(is.null(user), NA, user))))
} else {
st[id == s_id, status:=s]
st[id == s_id, owner:=ifelse(is.null(user), NA, user)]
}
new_dt[id == s_id, status :=s]
new_dt[id == s_id, owner :=user]
return (new_dt)
}

#### SERVER ###############################
function(input, output, session) {

output$my_table = DT::renderDataTable({
render_my_table(dt)
}, server=TRUE)

observeEvent(input$my_table_cell_clicked, {
row = as.numeric(input$my_table_rows_selected)
user = dt[row]
if(nrow(user) == 0) {
return ()
}
session$userData$curr_case <- user$id
session$userData$curr_row <- row
output$my_status <- renderUI({
selectInput("my_status", "", c('NEW','PENDING','SOLVED','CLOSED'), selected=user$status)
})
shinyjs::showElement(id= "my_panel")
})

observeEvent(input$my_status, {
if(isTRUE(session$userData$curr_case != "")) {
new_dt = dt
current_status = new_dt[id == session$userData$curr_case]$status
new_status = input$my_status
if(current_status != new_status) {
new_dt = change_status(session$userData$curr_case, new_status, get_user_ses(), new_dt)
output$my_table = DT::renderDataTable({
render_my_table(new_dt, session$userData$curr_row)
})
}
}
})
}


Basically, you can think of the rows of the data table as "transactions" being investigated by the intended users.
Once a user selects a row from the table, a hidden panel pops up to the right of the table. This panel contains additional details regarding the "transaction" but more importantly, it also shows a drop down list (selectInput) containing a list of "statuses" that the user can choose to update the value of column status of the selected row.



Right now, the code works as intended. However, it has a bug that annoys the users of the tool. Once a user is on a page, other than page 1, of the data table (e.g. page 2,... to page n) and he/she has updated the status of an investigated row, the change happens but the data table reloads at the first page.



So going back to my problem statement, is there any way I can write the code using R Shiny functions where the user can update the cell real-time (via the drop down list) without the table reloading back to the first page?



I've tried searching here and the internet for days, but until now no luck. Any leads would be appreciated. Thanks!



Miklos










share|improve this question









New contributor




Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    up vote
    2
    down vote

    favorite
    1












    PROBLEM: R Shiny Data Table reloads to the first page whenever user is on a different page of the data table and updates a certain column value (via selectInput).



    Hi Stack Users,



    In R Shiny, I've created a Shiny application that contains a data table (renderDataTable) where a cell value of column "status" can be updated (via selectInput) by its intended users.



    I've prepared a simplified sample of the code below.



    ui.R



    require(shiny)
    require(shinydashboard)
    require(shinyjs)
    require(data.table)
    require(dplyr)
    require(DT)
    require(htmltools)

    shinyUI(fluidPage(
    useShinyjs(),
    mainPanel("",
    fluidRow(
    splitLayout(#cellWidths = c("110%", "40%"),
    div(DT::dataTableOutput('my_table')),
    div(
    shinyjs::hidden(
    wellPanel(id="my_panel",
    h3("Update Status",align="center"),
    htmlOutput("my_status")
    )
    )
    )
    )
    )
    )
    ))


    server.R



    #### DATA PREP AND FUNCTIONS ######################
    id <- c('10001','10002','10003','10004','10005',
    '10006','10007','10008','10009','10010',
    '10011','10012','10013','10014','10015')
    status <- c('NEW','PENDING','SOLVED','CLOSED','NEW',
    'PENDING','SOLVED','CLOSED','NEW','PENDING',
    'SOLVED','CLOSED','NEW','PENDING','SOLVED')
    owner <- c('Alice','Bob','Carol','Dave','Me',
    'Carol','Bob','Dave','Me','Alice',
    'Me','Dave','Bob','Alice','Carol')

    dt <- data.table(id=id,status=status)
    st <- data.table(id=id,status=status,owner=owner)

    render_my_table <- function(dt, sel) {
    if(missing(sel)) {
    sel = list(mode='single')
    } else {
    sel = list(mode='single', selected = sel)
    }
    return (DT::datatable(dt[, list("ID" = id, "Status"=status)],
    selection = sel, filter="top",
    options = list(sDom = '<"top">lrt<"bottom">ip',
    lengthChange = FALSE,
    pageLength = 5))) %>% formatStyle(
    'Status',
    target = 'row',
    backgroundColor = styleEqual(c('NEW', 'PENDING', 'SOLVED', 'CLOSED'), c('white', 'yellow', 'dodgerblue', 'green'))
    )
    }

    get_user_ses <- function() {
    return ("Me")
    }


    change_status <- function(s_id, s, user, new_dt) {
    if(!(s %in% c('NEW', 'PENDING', 'FRAUD', 'SOLVED', 'CLOSED'))) {
    return (new_dt)
    }
    st = st
    if(nrow(st[id == s_id]) == 0) {
    st = rbind(st, data.table("id" = c(s_id), "status" = c(s), "owner" = c(ifelse(is.null(user), NA, user))))
    } else {
    st[id == s_id, status:=s]
    st[id == s_id, owner:=ifelse(is.null(user), NA, user)]
    }
    new_dt[id == s_id, status :=s]
    new_dt[id == s_id, owner :=user]
    return (new_dt)
    }

    #### SERVER ###############################
    function(input, output, session) {

    output$my_table = DT::renderDataTable({
    render_my_table(dt)
    }, server=TRUE)

    observeEvent(input$my_table_cell_clicked, {
    row = as.numeric(input$my_table_rows_selected)
    user = dt[row]
    if(nrow(user) == 0) {
    return ()
    }
    session$userData$curr_case <- user$id
    session$userData$curr_row <- row
    output$my_status <- renderUI({
    selectInput("my_status", "", c('NEW','PENDING','SOLVED','CLOSED'), selected=user$status)
    })
    shinyjs::showElement(id= "my_panel")
    })

    observeEvent(input$my_status, {
    if(isTRUE(session$userData$curr_case != "")) {
    new_dt = dt
    current_status = new_dt[id == session$userData$curr_case]$status
    new_status = input$my_status
    if(current_status != new_status) {
    new_dt = change_status(session$userData$curr_case, new_status, get_user_ses(), new_dt)
    output$my_table = DT::renderDataTable({
    render_my_table(new_dt, session$userData$curr_row)
    })
    }
    }
    })
    }


    Basically, you can think of the rows of the data table as "transactions" being investigated by the intended users.
    Once a user selects a row from the table, a hidden panel pops up to the right of the table. This panel contains additional details regarding the "transaction" but more importantly, it also shows a drop down list (selectInput) containing a list of "statuses" that the user can choose to update the value of column status of the selected row.



    Right now, the code works as intended. However, it has a bug that annoys the users of the tool. Once a user is on a page, other than page 1, of the data table (e.g. page 2,... to page n) and he/she has updated the status of an investigated row, the change happens but the data table reloads at the first page.



    So going back to my problem statement, is there any way I can write the code using R Shiny functions where the user can update the cell real-time (via the drop down list) without the table reloading back to the first page?



    I've tried searching here and the internet for days, but until now no luck. Any leads would be appreciated. Thanks!



    Miklos










    share|improve this question









    New contributor




    Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      2
      down vote

      favorite
      1









      up vote
      2
      down vote

      favorite
      1






      1





      PROBLEM: R Shiny Data Table reloads to the first page whenever user is on a different page of the data table and updates a certain column value (via selectInput).



      Hi Stack Users,



      In R Shiny, I've created a Shiny application that contains a data table (renderDataTable) where a cell value of column "status" can be updated (via selectInput) by its intended users.



      I've prepared a simplified sample of the code below.



      ui.R



      require(shiny)
      require(shinydashboard)
      require(shinyjs)
      require(data.table)
      require(dplyr)
      require(DT)
      require(htmltools)

      shinyUI(fluidPage(
      useShinyjs(),
      mainPanel("",
      fluidRow(
      splitLayout(#cellWidths = c("110%", "40%"),
      div(DT::dataTableOutput('my_table')),
      div(
      shinyjs::hidden(
      wellPanel(id="my_panel",
      h3("Update Status",align="center"),
      htmlOutput("my_status")
      )
      )
      )
      )
      )
      )
      ))


      server.R



      #### DATA PREP AND FUNCTIONS ######################
      id <- c('10001','10002','10003','10004','10005',
      '10006','10007','10008','10009','10010',
      '10011','10012','10013','10014','10015')
      status <- c('NEW','PENDING','SOLVED','CLOSED','NEW',
      'PENDING','SOLVED','CLOSED','NEW','PENDING',
      'SOLVED','CLOSED','NEW','PENDING','SOLVED')
      owner <- c('Alice','Bob','Carol','Dave','Me',
      'Carol','Bob','Dave','Me','Alice',
      'Me','Dave','Bob','Alice','Carol')

      dt <- data.table(id=id,status=status)
      st <- data.table(id=id,status=status,owner=owner)

      render_my_table <- function(dt, sel) {
      if(missing(sel)) {
      sel = list(mode='single')
      } else {
      sel = list(mode='single', selected = sel)
      }
      return (DT::datatable(dt[, list("ID" = id, "Status"=status)],
      selection = sel, filter="top",
      options = list(sDom = '<"top">lrt<"bottom">ip',
      lengthChange = FALSE,
      pageLength = 5))) %>% formatStyle(
      'Status',
      target = 'row',
      backgroundColor = styleEqual(c('NEW', 'PENDING', 'SOLVED', 'CLOSED'), c('white', 'yellow', 'dodgerblue', 'green'))
      )
      }

      get_user_ses <- function() {
      return ("Me")
      }


      change_status <- function(s_id, s, user, new_dt) {
      if(!(s %in% c('NEW', 'PENDING', 'FRAUD', 'SOLVED', 'CLOSED'))) {
      return (new_dt)
      }
      st = st
      if(nrow(st[id == s_id]) == 0) {
      st = rbind(st, data.table("id" = c(s_id), "status" = c(s), "owner" = c(ifelse(is.null(user), NA, user))))
      } else {
      st[id == s_id, status:=s]
      st[id == s_id, owner:=ifelse(is.null(user), NA, user)]
      }
      new_dt[id == s_id, status :=s]
      new_dt[id == s_id, owner :=user]
      return (new_dt)
      }

      #### SERVER ###############################
      function(input, output, session) {

      output$my_table = DT::renderDataTable({
      render_my_table(dt)
      }, server=TRUE)

      observeEvent(input$my_table_cell_clicked, {
      row = as.numeric(input$my_table_rows_selected)
      user = dt[row]
      if(nrow(user) == 0) {
      return ()
      }
      session$userData$curr_case <- user$id
      session$userData$curr_row <- row
      output$my_status <- renderUI({
      selectInput("my_status", "", c('NEW','PENDING','SOLVED','CLOSED'), selected=user$status)
      })
      shinyjs::showElement(id= "my_panel")
      })

      observeEvent(input$my_status, {
      if(isTRUE(session$userData$curr_case != "")) {
      new_dt = dt
      current_status = new_dt[id == session$userData$curr_case]$status
      new_status = input$my_status
      if(current_status != new_status) {
      new_dt = change_status(session$userData$curr_case, new_status, get_user_ses(), new_dt)
      output$my_table = DT::renderDataTable({
      render_my_table(new_dt, session$userData$curr_row)
      })
      }
      }
      })
      }


      Basically, you can think of the rows of the data table as "transactions" being investigated by the intended users.
      Once a user selects a row from the table, a hidden panel pops up to the right of the table. This panel contains additional details regarding the "transaction" but more importantly, it also shows a drop down list (selectInput) containing a list of "statuses" that the user can choose to update the value of column status of the selected row.



      Right now, the code works as intended. However, it has a bug that annoys the users of the tool. Once a user is on a page, other than page 1, of the data table (e.g. page 2,... to page n) and he/she has updated the status of an investigated row, the change happens but the data table reloads at the first page.



      So going back to my problem statement, is there any way I can write the code using R Shiny functions where the user can update the cell real-time (via the drop down list) without the table reloading back to the first page?



      I've tried searching here and the internet for days, but until now no luck. Any leads would be appreciated. Thanks!



      Miklos










      share|improve this question









      New contributor




      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      PROBLEM: R Shiny Data Table reloads to the first page whenever user is on a different page of the data table and updates a certain column value (via selectInput).



      Hi Stack Users,



      In R Shiny, I've created a Shiny application that contains a data table (renderDataTable) where a cell value of column "status" can be updated (via selectInput) by its intended users.



      I've prepared a simplified sample of the code below.



      ui.R



      require(shiny)
      require(shinydashboard)
      require(shinyjs)
      require(data.table)
      require(dplyr)
      require(DT)
      require(htmltools)

      shinyUI(fluidPage(
      useShinyjs(),
      mainPanel("",
      fluidRow(
      splitLayout(#cellWidths = c("110%", "40%"),
      div(DT::dataTableOutput('my_table')),
      div(
      shinyjs::hidden(
      wellPanel(id="my_panel",
      h3("Update Status",align="center"),
      htmlOutput("my_status")
      )
      )
      )
      )
      )
      )
      ))


      server.R



      #### DATA PREP AND FUNCTIONS ######################
      id <- c('10001','10002','10003','10004','10005',
      '10006','10007','10008','10009','10010',
      '10011','10012','10013','10014','10015')
      status <- c('NEW','PENDING','SOLVED','CLOSED','NEW',
      'PENDING','SOLVED','CLOSED','NEW','PENDING',
      'SOLVED','CLOSED','NEW','PENDING','SOLVED')
      owner <- c('Alice','Bob','Carol','Dave','Me',
      'Carol','Bob','Dave','Me','Alice',
      'Me','Dave','Bob','Alice','Carol')

      dt <- data.table(id=id,status=status)
      st <- data.table(id=id,status=status,owner=owner)

      render_my_table <- function(dt, sel) {
      if(missing(sel)) {
      sel = list(mode='single')
      } else {
      sel = list(mode='single', selected = sel)
      }
      return (DT::datatable(dt[, list("ID" = id, "Status"=status)],
      selection = sel, filter="top",
      options = list(sDom = '<"top">lrt<"bottom">ip',
      lengthChange = FALSE,
      pageLength = 5))) %>% formatStyle(
      'Status',
      target = 'row',
      backgroundColor = styleEqual(c('NEW', 'PENDING', 'SOLVED', 'CLOSED'), c('white', 'yellow', 'dodgerblue', 'green'))
      )
      }

      get_user_ses <- function() {
      return ("Me")
      }


      change_status <- function(s_id, s, user, new_dt) {
      if(!(s %in% c('NEW', 'PENDING', 'FRAUD', 'SOLVED', 'CLOSED'))) {
      return (new_dt)
      }
      st = st
      if(nrow(st[id == s_id]) == 0) {
      st = rbind(st, data.table("id" = c(s_id), "status" = c(s), "owner" = c(ifelse(is.null(user), NA, user))))
      } else {
      st[id == s_id, status:=s]
      st[id == s_id, owner:=ifelse(is.null(user), NA, user)]
      }
      new_dt[id == s_id, status :=s]
      new_dt[id == s_id, owner :=user]
      return (new_dt)
      }

      #### SERVER ###############################
      function(input, output, session) {

      output$my_table = DT::renderDataTable({
      render_my_table(dt)
      }, server=TRUE)

      observeEvent(input$my_table_cell_clicked, {
      row = as.numeric(input$my_table_rows_selected)
      user = dt[row]
      if(nrow(user) == 0) {
      return ()
      }
      session$userData$curr_case <- user$id
      session$userData$curr_row <- row
      output$my_status <- renderUI({
      selectInput("my_status", "", c('NEW','PENDING','SOLVED','CLOSED'), selected=user$status)
      })
      shinyjs::showElement(id= "my_panel")
      })

      observeEvent(input$my_status, {
      if(isTRUE(session$userData$curr_case != "")) {
      new_dt = dt
      current_status = new_dt[id == session$userData$curr_case]$status
      new_status = input$my_status
      if(current_status != new_status) {
      new_dt = change_status(session$userData$curr_case, new_status, get_user_ses(), new_dt)
      output$my_table = DT::renderDataTable({
      render_my_table(new_dt, session$userData$curr_row)
      })
      }
      }
      })
      }


      Basically, you can think of the rows of the data table as "transactions" being investigated by the intended users.
      Once a user selects a row from the table, a hidden panel pops up to the right of the table. This panel contains additional details regarding the "transaction" but more importantly, it also shows a drop down list (selectInput) containing a list of "statuses" that the user can choose to update the value of column status of the selected row.



      Right now, the code works as intended. However, it has a bug that annoys the users of the tool. Once a user is on a page, other than page 1, of the data table (e.g. page 2,... to page n) and he/she has updated the status of an investigated row, the change happens but the data table reloads at the first page.



      So going back to my problem statement, is there any way I can write the code using R Shiny functions where the user can update the cell real-time (via the drop down list) without the table reloading back to the first page?



      I've tried searching here and the internet for days, but until now no luck. Any leads would be appreciated. Thanks!



      Miklos







      r shiny data.table selectinput






      share|improve this question









      New contributor




      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 2 hours ago





















      New contributor




      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 3 hours ago









      Miklos Morada

      112




      112




      New contributor




      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Miklos Morada is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





























          active

          oldest

          votes











          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',
          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
          });


          }
          });






          Miklos Morada is a new contributor. Be nice, and check out our Code of Conduct.










           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53370892%2fr-shiny-data-table-renderdatatable-reloads-to-first-page-when-user-is-on-a-d%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          Miklos Morada is a new contributor. Be nice, and check out our Code of Conduct.










           

          draft saved


          draft discarded


















          Miklos Morada is a new contributor. Be nice, and check out our Code of Conduct.













          Miklos Morada is a new contributor. Be nice, and check out our Code of Conduct.












          Miklos Morada is a new contributor. Be nice, and check out our Code of Conduct.















           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53370892%2fr-shiny-data-table-renderdatatable-reloads-to-first-page-when-user-is-on-a-d%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

          MongoDB - Not Authorized To Execute Command

          in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

          How to fix TextFormField cause rebuild widget in Flutter