在保持位置的同时更新 Shiny DataTable 的行
Update row(s) of a Shiny DataTable while maintaining position
我正在创建一个闪亮的应用程序,它在屏幕顶部显示 data.frame 信息,在底部显示特定的变量统计信息。用户可以通过与 DT::datatable
object.
交互来导航 data.frame 列
当用户单击变量时,会显示可以编辑的详细信息。我希望此信息得到更新并反映在数据中table。我的问题是,当我更新 table 时,它会从头开始渲染和显示。 如何在编辑后保留数据的页和行选择table?
这是一个最小的工作示例,它在 DT::datatable
中显示了 mtcars 数据集。我有一些更新字段的控件。注意datatable是re-rendered回到第一页
library(shiny)
runApp(shinyApp(
ui = fluidPage(
title = "minimal-working-example",
fluidRow(
column(3, inputPanel(
selectInput("field", "Field", choices = names(mtcars)),
numericInput("value", "Value", 0),
actionButton("submit", "Submit")
)),
column(9,
DT::dataTableOutput("table")
)
)
),
server = function(input, output) {
v <- reactiveValues(mtcars=mtcars)
observeEvent(input$submit, {
v$mtcars[input$field] <- input$value
})
output$table <- DT::renderDataTable({
DT::datatable(
v$mtcars,
selection = "single",
options = list(pageLength = 5))
})
}
))
Session 信息:
Session info --------------------------
setting value
version R version 3.3.0 (2016-05-03)
system x86_64, mingw32
ui RStudio (0.99.902)
language (EN)
collate English_United States.1252
tz America/Chicago
date 2016-07-11
Packages -------------------------------
package * version date source
DT 0.1.45 2016-02-09 Github (rstudio/DT@a63e9ac)
shiny * 0.13.0.9000 2016-02-08 Github (rstudio/shiny@e871934)
这可以从 R 内部完成,而无需通过 JS 或类似的东西进入 datatable
的结构。
我们利用从 DT
包中获得的各种 table 状态信息来渲染新更新的 datatable
,就像之前的一样。 this DT
documentation 中描述了我们使用的所有内容。
项目一:选择。您可以通过在数据 table 的 selection
参数中添加 selected = ...
来预先 select 行。这可以与变量 input$table_rows_selected
结合使用,以保存先前 select 编辑的行,并在重新呈现时预 select 那个确切的行。
项目二:页面。 datatable
包有一个选项 displayStart
指定在呈现 table 时应首先显示哪一行。 Documentation here. 因此,如果每页有 5 行,displayStart = 9
将在第 3 页开始显示。(JavaScript 数组从 0 开始,因此总是减去 1。)这可以与input$table_rows_current
这是当前可见行号的向量。如果我们存储第一个条目(减 1),我们就知道从哪里开始显示。
完整代码示例如下:
library(shiny)
runApp(shinyApp(
ui = fluidPage(
title = "minimal-working-example",
fluidRow(
column(3, inputPanel(
selectInput("field", "Field", choices = names(mtcars)),
numericInput("value", "Value", 0),
actionButton("submit", "Submit")
)),
column(9,
DT::dataTableOutput("table")
)
)
),
server = function(input, output) {
v <- reactiveValues(mtcars=mtcars)
previousSelection <- NULL
previousPage <- NULL
observeEvent(input$submit, {
previousSelection <<- input$table_rows_selected
previousPage <<- input$table_rows_current[1] - 1
v$mtcars[input$field] <- input$value
})
output$table <- DT::renderDataTable({
DT::datatable(
v$mtcars,
selection = list(mode = "single", target = "row", selected = previousSelection),
options = list(pageLength = 5, displayStart = previousPage))
})
}
))
我正在创建一个闪亮的应用程序,它在屏幕顶部显示 data.frame 信息,在底部显示特定的变量统计信息。用户可以通过与 DT::datatable
object.
当用户单击变量时,会显示可以编辑的详细信息。我希望此信息得到更新并反映在数据中table。我的问题是,当我更新 table 时,它会从头开始渲染和显示。 如何在编辑后保留数据的页和行选择table?
这是一个最小的工作示例,它在 DT::datatable
中显示了 mtcars 数据集。我有一些更新字段的控件。注意datatable是re-rendered回到第一页
library(shiny)
runApp(shinyApp(
ui = fluidPage(
title = "minimal-working-example",
fluidRow(
column(3, inputPanel(
selectInput("field", "Field", choices = names(mtcars)),
numericInput("value", "Value", 0),
actionButton("submit", "Submit")
)),
column(9,
DT::dataTableOutput("table")
)
)
),
server = function(input, output) {
v <- reactiveValues(mtcars=mtcars)
observeEvent(input$submit, {
v$mtcars[input$field] <- input$value
})
output$table <- DT::renderDataTable({
DT::datatable(
v$mtcars,
selection = "single",
options = list(pageLength = 5))
})
}
))
Session 信息:
Session info --------------------------
setting value
version R version 3.3.0 (2016-05-03)
system x86_64, mingw32
ui RStudio (0.99.902)
language (EN)
collate English_United States.1252
tz America/Chicago
date 2016-07-11
Packages -------------------------------
package * version date source
DT 0.1.45 2016-02-09 Github (rstudio/DT@a63e9ac)
shiny * 0.13.0.9000 2016-02-08 Github (rstudio/shiny@e871934)
这可以从 R 内部完成,而无需通过 JS 或类似的东西进入 datatable
的结构。
我们利用从 DT
包中获得的各种 table 状态信息来渲染新更新的 datatable
,就像之前的一样。 this DT
documentation 中描述了我们使用的所有内容。
项目一:选择。您可以通过在数据 table 的 selection
参数中添加 selected = ...
来预先 select 行。这可以与变量 input$table_rows_selected
结合使用,以保存先前 select 编辑的行,并在重新呈现时预 select 那个确切的行。
项目二:页面。 datatable
包有一个选项 displayStart
指定在呈现 table 时应首先显示哪一行。 Documentation here. 因此,如果每页有 5 行,displayStart = 9
将在第 3 页开始显示。(JavaScript 数组从 0 开始,因此总是减去 1。)这可以与input$table_rows_current
这是当前可见行号的向量。如果我们存储第一个条目(减 1),我们就知道从哪里开始显示。
完整代码示例如下:
library(shiny)
runApp(shinyApp(
ui = fluidPage(
title = "minimal-working-example",
fluidRow(
column(3, inputPanel(
selectInput("field", "Field", choices = names(mtcars)),
numericInput("value", "Value", 0),
actionButton("submit", "Submit")
)),
column(9,
DT::dataTableOutput("table")
)
)
),
server = function(input, output) {
v <- reactiveValues(mtcars=mtcars)
previousSelection <- NULL
previousPage <- NULL
observeEvent(input$submit, {
previousSelection <<- input$table_rows_selected
previousPage <<- input$table_rows_current[1] - 1
v$mtcars[input$field] <- input$value
})
output$table <- DT::renderDataTable({
DT::datatable(
v$mtcars,
selection = list(mode = "single", target = "row", selected = previousSelection),
options = list(pageLength = 5, displayStart = previousPage))
})
}
))