Пока @thothal предлагает решение, здесь я бы хотел прямо ответить на вопрос. Когда вы инициализируете свое приложение, DataTables просто пустые <divs>
, которые заполняются содержимым только тогда, когда пользователь открывает приложение. Чтобы проверить это, запустите ваш пример, откройте его в браузере и затем (в Firefox) щелкните правой кнопкой мыши -> Просмотреть исходный код страницы. Для объяснения см. здесь .
Давайте посмотрим на это в вашем приложении - я добавил несколько «отладочных отпечатков» и предупреждение js, которое поможет:
library(shiny)
library(DT)
ui <- bootstrapPage(
shiny::tags$script(
"$(document).on('shiny:sessioninitialized', function(event) {
alert('Connected to the server');
});"
),
dataTableOutput("table1"),
dataTableOutput("table2"))
server <- function(input, output) {
# this ignores input$table1_rows_all being NULL and runs only when there is a value
observeEvent(
input$table1_rows_all,
{
print("observeEvent called")
print(input$table1_rows_all)
}
)
output$table1 <- renderDataTable({
print("renderDataTable -- table 1 called")
datatable(iris,filter="top")
})
output$table2 <- renderDataTable({
print("renderDataTable -- table 2 called")
if (is.null(input$table1_rows_all)) {
print("input$table1_rows_all is NULL")
}
data <- iris[input$table1_rows_all,]
datatable(data)
})
}
shinyApp(ui = ui, server = server, options = list(launch.browser = FALSE))
Запустите приложение и откройте его в браузере. Вы видите, что сеанс инициализирован и каждый renderDataTable
был запущен один раз. Как уже упоминалось ранее, они сейчас являются просто пустыми заполнителями, а переменная input$table1_rows_all
на данный момент просто не существует - поэтому у вас 0 строк.
[1] "renderDataTable -- table 1 called"
[1] "renderDataTable -- table 2 called"
[1] "input$table1_rows_all is NULL"
Нажмите кнопку ОК, чтобы продолжить. Следующие строки печатаются впоследствии:
[1] "renderDataTable -- table 2 called"
[1] "input$table1_rows_all is NULL"
[1] "observeEvent called"
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
[29] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
[57] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
[85] 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
[113] 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
[141] 141 142 143 144 145 146 147 148 149 150
[1] "renderDataTable -- table 2 called"
Мое понимание того, что здесь происходит, следующее:
1) почему-то вызывается функция renderDataTable
для table2
. Тем не менее, input$table1_rows_all
по-прежнему NULL
.
2) table1
фактически обрабатывается (то есть загружаются строки), поэтому input$table1_rows_all
становится доступным. Это приводит к печати с observeEvent
и другому вызову с renderDataTable
для table2
.