Проблема в том, что ваш vals
является объектом reactiveValues
, который содержит reactive
объектов. reactiveValuesToList
фактически преобразует ваш reactiveValues
объект в список, который все еще содержит reactives
. То есть вы должны «вызвать» их, чтобы получить их значение (например, vals[[1]]()
).
На самом деле вам не нужно, чтобы vals
был реактивным, если вы не хотите добавить несколько лог c для реакции ive (каламбур) добавлен новый элемент.
Замена vals <- reactiveValues()
на vals <- list()
будет одинаково работать (и удалит небольшие накладные расходы).
Как бы вы ни решили , в какой-то момент вам нужно l oop через reactive
элементы vals
и получить их значения.
Таким образом, я бы написал ваш сервер следующим образом:
server <- function(input, output, session){
vals <- list() # can also be changed to reactiveValues()...
# reactive code
filterset <- eventReactive(
{
input$apply
},
{
vals2 <- lapply(
# ...however the implicit transformation to a list here
# is better done explicitly in this case
# reactiveValuesToList(vals)
vals,
function(x) x()
)
subsel(dataset, vals2)
}
)
# pickers + filter values
vals[['V1']] <- excelStyleFilterServer('V1', filterset)
vals[['V2']] <- excelStyleFilterServer('V2', filterset)
vals[['V3']] <- excelStyleFilterServer('V3', filterset)
# table output
output$tab <- renderTable({
filterset()
})
}
Бонусный ответ
Вы должны поместить свой box
вместе с таблицей в fluidRow
, чтобы содержимое не разлилось в поле:
fluidRow(
box(
title = 'Dataset',
tableOutput('tab')
)
)