2015-12-22 3 views
1

Этот вопрос простирается от another question, который правильно объясняет, как использовать кнопку для подмножества DataFrame на основе слайдера.R shiny eventReactive button subsets dataframe на основе выбранного checkboxgroup

Мне нужна более конкретная помощь с моей реальной проблемой.

У меня есть функция «transition_matrix» в моем server.R, который принимает 2 входа: (а) dataframe, содержащий информацию о продукте и (б) даты. Я предварительно загружаю фрейм данных как фиксированный, но затем разрешаю пользователю изменять дату. Таким образом, когда пользователь меняет дату, функция выполняется для данного фрейма данных и выбранной даты.

код до сих пор:

server.R

shinyServer(function(input, output) { 

    bigmatrix <- reactive({ 
    transition_matrix(capital_summary_cum, ceiling_date(as.Date(input$datebox),"month")-1) 
    }) 

output$balance_matrix <- renderTable({ 
    balances_ <- bigmatrix()[1:(default_state +2),] %>% 
     round(digits = 0) %>% 
     format(big.mark = ",") 

    transition_matrix <- function(df1, date1){ 
    date2 <- ceiling_date(as.Date(AddMonths(date1,1)),"month")-days(1) 
    ... 
    ... 

То, что я хочу делать дальше, чтобы позволить пользователю подмножество в dateframe, а также. Для этого я предлагаю группу флажков, которые представляют собой продукты. Таким образом, помимо даты, пользователь может также выбрать подмножество продуктов, на которых будет выполняться вышеупомянутая функция.

Проблема заключается в том, что для выполнения функции требуется около 1,5 секунд, поэтому каждый раз, когда пользователь будет проверять коробку (из которых около 40), функция будет называться, создавая нежелательную задержку в 1,5 секунды.

Я скорее хочу выделить (?) Флажки, чтобы пользователь мог выбрать нужный список продуктов до тех пор, пока не будет нажата кнопка. После нажатия кнопки я хочу подмножить блок данных на основе выбранных флажков и только потом передать это в функцию. Мне действительно хотелось бы, чтобы дата ввода оставалась «полностью реактивной», поэтому мне не нужно нажимать кнопку каждый раз, когда дата также изменяется.

Как добавить кнопку, которая будет подмножать мою фреймворк на основе выбранных флажков и автоматически вызывать функцию с выбранной датой?

+0

Что произойдет, если вы используете 'eventReactive' вместо' реактивного' для вашей функции 'bigmatrix'? Обратите внимание, что вам нужен 'input $ datebox' в качестве первого аргумента для' eventReactive'. Если это не дает желаемого результата, возможно, флажки проверяются где-то еще в вашем коде. –

+0

В качестве альтернативы вы можете использовать 'isolate' для флажков, чтобы блестящие игнорировали это обновление. Shiny игнорирует изолированные объекты, поэтому обновляет страницу при обновлении. Я не вижу флажки в вашем коде, но думаю, что они находятся где-то в функции «transition_matrix». –

+0

На этом этапе я не знаю, как добавить флажки, чтобы они были «изолированы», но запускались с помощью кнопки. Добавляю ли я его в реактивную функцию «bigmatrix»? Если да, то как мне «запустить» его с помощью кнопки? Извините, я действительно новичок в R .. – gmarais

ответ

1

Я думаю, что это нечто похожее на то, чего вы хотите достичь. Примечание:

Используйте reactiveEvent, чтобы указать, на что реагировать ваше приложение. В этом случае функция get_table реагирует на кнопку обновления и флажок для даты, а флажок для переменных не вызывает функцию.

Для вашей информации actionButton имеет целочисленное значение внутри, а при щелчке значение увеличивается на единицу. Приложение обнаруживает изменения в значении и запускает функцию.

library(shiny) 
ui <- list(checkboxGroupInput("varbox", "Variable", choices = c("x", "y")), 
      br(), br(), 
      checkboxGroupInput("datebox", "Date", choices = c("1", "2", "3")), 
      br(), br(), 
      actionButton("btn", "update"), 
      tableOutput("tbl")) 

server <- function(input, output) { 

    sub_fun <- function(dates, variables) { 
    # sub function to create table 
    # this does not have any reactive element inside 
    tmp <- data.frame(day = rep(1:3, 4), x = 1:12, y = 13:24) 
    tmp[tmp$day %in% dates, c("day", variables), drop = FALSE] 
    } 

    get_table <- eventReactive({input$btn; input$datebox}, { 
    # reactive function to define the configulation 
    sub_fun(as.character(input$datebox), input$varbox) 
    }) 

    output$tbl <- renderTable({ 
    get_table() 
    }) 
} 

runApp(list(ui = ui, server = server)) 
Смежные вопросы