Этот вопрос является более динамичной версией this.Предварительно выбирайте строки динамического DT в блестящем
У меня есть 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())))
)
}
)
Это было право выбора, но есть ошибка Warning: Error in seq_len: argument must be coercible to non-negative integer
в самом начале. Я думаю, это потому, что seq_len
не может принимать вход NULL
. Интересно, что после инициализации переключение туда и обратно не вызывает новых ошибок.
Я попробовал эту версию, чтобы использовать реактивное значение для строк вектора, с пустым результатом для пустого ввода:
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)
}
})
all_rows <- reactive({
df <- data()
if (is.null(df)) {
return(seq_len(0))
} else {
return(seq_len(nrow(df)))
}
})
output$x1 = DT::renderDataTable(
data(), server = FALSE,
selection = list(mode = 'multiple', selected = all_rows()))
}
)
Однако это не работает. Я попробовал другую версию, которая использовала модифицированный seq_len
, но она также не работает.
library(shiny)
library(DT)
seq_len_null_check <- function(len){
if (is.null(len)){
return(integer(0))
} else {
return(seq_len(len))
}
}
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_null_check(nrow(data())))
)
}
)
Как удалить ошибку в первой версии или сделать работу 2-й, 3-й версии?
Я нашел с помощью 'validate' может удалить первую ошибку. Однако, когда я переключался между двумя типами источников данных, DT всегда выбирается с номером строки первой таблицы. Поэтому, когда источник данных изменяет DT-обновления, но не меняет предварительный выбор одновременно. – dracodoc