我正在创建一个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 …Run Code Online (Sandbox Code Playgroud) 这个问题的更多动态版本此。
我在闪亮的应用程序中有一个DT,初始化时可能为空。我想预选DT中的所有行。我的第一次尝试是这样的:
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
fluidRow(
radioButtons("select", "", c("none", "iris")),
DT::dataTableOutput('x1')
)
),
server = function(input, output, session) {
data <- reactive({
if (input$select == "none") {
return(NULL)
} else if (input$select == "iris"){
return(iris)
}
})
output$x1 = DT::renderDataTable(
data(), server = FALSE,
selection = list(mode = 'multiple', selected = seq_len(nrow(data())))
)
}
)
Run Code Online (Sandbox Code Playgroud)
它选择正确,但Warning: Error in seq_len: argument must be coercible to non-negative integer开头有错误。我认为这是因为seq_len无法接受NULL输入。有趣的是,初始化之后,来回切换不会产生新的错误。
我尝试使用此版本对行向量使用反应值,对空输入使用空结果:
library(shiny)
library(DT) …Run Code Online (Sandbox Code Playgroud)