2017-02-06 23 views
1

Этот вопрос является более динамичной версией 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-й версии?

+0

Я нашел с помощью 'validate' может удалить первую ошибку. Однако, когда я переключался между двумя типами источников данных, DT всегда выбирается с номером строки первой таблицы. Поэтому, когда источник данных изменяет DT-обновления, но не меняет предварительный выбор одновременно. – dracodoc

ответ

4

Чтобы реактивный на выбранной оценке, вам нужно позвонить datatable изнутри renderDataTable:

output$x1 = renderDataTable(
       datatable(data(), 
         selection = list(mode = 'multiple', selected = all_rows())), 
       server = FALSE) 
+0

Спасибо! Это позволило решить проблему с ошибкой и обновить предварительный выбор по проблеме данных. – dracodoc