我正在创建一个Shiny应用程序,它在屏幕顶部显示data.frame信息,在底部显示特定的变量统计信息.用户可以通过与DT::datatable对象交互来导航data.frame列.
当用户点击变量时,会显示可以编辑的详细信息.我希望这些信息能够更新并反映在数据表中.我的问题是,当我更新表时,它会从一开始就呈现并显示.如何在编辑后保留数据表的页面和行选择?
这是一个最小的工作示例,显示了a中的mtcars数据集DT::datatable.我有一些控制更新字段.请注意,数据表重新渲染回第一页.
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))
})
}
))
Run Code Online (Sandbox Code Playgroud)
会话信息:
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)
Run Code Online (Sandbox Code Playgroud)
这可以从R内部完成,而不会进入datatable通过JS 的结构或类似的东西.
我们利用从DT包中获得的各种表状态信息来呈现新的更新,datatable就像之前一样.我们使用的所有内容都在本DT文档中描述.
第一项:选择.您可以通过selected = ...在数据表的selection参数内添加来预先选择行.这可以与变量组合input$table_rows_selected以保存先前选择的行,并在重新渲染时预先选择该确切的行.
第二项:Page.该datatable包有一个选项displayStart,指定在呈现表时应首先显示哪一行.文档在这里.因此,如果每页有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))
})
}
))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2963 次 |
| 最近记录: |