Блестящая ошибка области видимости с помощьюObservEvent

У меня есть следующее в server.R в блестящем приложении...

shinyServer(function(input, output, session) {

   observeEvent(
     input$goButton,  #dependency
     {
       Predictores<-reactive({
         test<-input$LUNES*20
         test2<-input$LUNES*30  
         data.frame("one" = test, 
                    "two" = test2)
       })
     output$productos<-renderTable({as.data.frame(Predictores())},
                                   include.rownames = FALSE )
     }
   )
})

Когда я пробую ui.R, это работает нормально, и приложение работает, но ничего не происходит, когда я нажимаю «goButton». Желаемым результатом будет таблица с фреймом данных (сейчас я тестирую).

Это отлично работает с такой реактивной функцией:

shinyServer(function(input, output, session) {

  Predictores<-reactive({
    test<-input$LUNES*20
    test2<-input$LUNES*30  
    data.frame("uno" = test, 
               "dos" = test2)
  })
output$productos<-renderTable({as.data.frame(Predictores())},
                               include.rownames = FALSE )
 })

Но поскольку реальное приложение будет вычислять модель с интенсивными вычислениями на основе входных данных, я хочу, чтобы расчет выполнялся только после того, как пользователь нажимает «перейти», а не каждый раз при изменении входных данных.

Я просмотрел блестящие документы, и это похоже на то, но, может быть, я упускаю какие-то правила области видимости? Может быть поэтому он работает, но я ничего не вижу...


person eflores89    schedule 03.09.2015    source источник


Ответы (1)


isolate свою кнопку, выполнив что-то вроде этого:

rm(list = ls())
library(shiny)

ui =(pageWithSidebar(
  headerPanel("Table output"),
  sidebarPanel(
    sliderInput("LUNES", "LUNES", 100, 500, 2000, sep = ""),
    actionButton("goButton","GO")
    ),
  mainPanel(tableOutput("productos"))
))

server = function(input, output, session){
  Predictores<-reactive({
    if (is.null(input$goButton) || input$goButton == 0){return()}
    isolate({
      input$goButton
      test<-input$LUNES*20
      test2<-input$LUNES*30  
      data.frame("uno" = test, "dos" = test2)
    })
  })
  output$productos<-renderTable({as.data.frame(Predictores())},include.rownames = FALSE )
}
runApp(list(ui = ui, server = server))

Пример вывода ниже

Образец

EDIT - ваш личный пример Я вижу, что вы немного перепутали скобки, посмотрите на решение ниже:

(list = ls())
library(shiny)

ui = (
  fluidPage(
    title = 'Modelo de Caídas en Venta',
    ## --------- titulo
    titlePanel("Modelo de Caídas en Venta"),
    ## --------- barra lado de inputs
    sidebarPanel(
      ## ----- tabs  
      tabsetPanel(type = "tabs", 
                  # tab 1 -------------------------
                  tabPanel("Mes", 
                           selectInput(inputId = "MES",label = "Mes a predecir",selectize = TRUE,choices = "201508"),
                           selectInput(inputId = "MES_APERTURA",label = "Mes Apertura",selectize = TRUE,choices = "201508"),
                           sliderInput(inputId = "LUNES",label = "Lunes en mes a predecir", value = 4,min = 2, max = 6),
                           sliderInput(inputId = "VIERNES",label = "Viernes en mes a predecir",value = 4,min = 2, max = 6),
                           sliderInput(inputId = "FINDE",label = "Dias de fin en mes a predecir",value = 8, min = 6, max = 10)), 
                  # tab 2 -------------------------
                  # tab 2 -------------------------
                  tabPanel("Mes Antes", 
                           helpText("Todos los indicadores en esta sección se refieren
                                    a un mes anterior al que se va predecir por el modelo"),
                           checkboxInput(inputId = "EVENTO_PREVIO", 
                                         label = "Caída un mes antes", 
                                         value = FALSE),
                           numericInput(inputId = "CLIENTES",
                                        label = "Clientes",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           # UNIDADES 
                           numericInput(inputId = "U_FARMAMP",
                                        label = "Unidades Farma MP",
                                        value = 7900,
                                        min = 900,  max = 29500),
                           numericInput(inputId = "U_OTCMP",
                                        label = "Unidades OTC MP",
                                        value = 7900,
                                        min = 900,  max = 29500),
                           numericInput(inputId = "U_BEBE",
                                        label = "Unidades Bebé",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           numericInput(inputId = "U_CONV",
                                        label = "Unidades Conveniencia",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           numericInput(inputId = "U_RECETA",
                                        label = "Unidades Receta",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           # YOY DE UNIDADES
                           numericInput(inputId = "Y_FARMAMP",
                                        label = "Unidades Farma MP (mes año pasado)",
                                        value = 7900,
                                        min = 900,  max = 29500),
                           numericInput(inputId = "Y_OTCMP",
                                        label = "Unidades OTC MP (mes año pasado)",
                                        value = 7900,
                                        min = 900,  max = 29500),
                           numericInput(inputId = "Y_BEBE",
                                        label = "Unidades Bebe (mes año pasado)",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           numericInput(inputId = "Y_CONV",
                                        label = "Unidades Conveniencia (mes año pasado)",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           numericInput(inputId = "Y_RECETA",
                                        label = "Unidades con Receta (mes año pasado)",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           #OTROS DE MES ANTES 
                           numericInput(inputId = "PROD",
                                        label = "Productos únicos",
                                        value = 2900,
                                        min = 1400,  max = 9500),
                           #PORCENTAJES DE CAÍDAS
                           sliderInput(inputId = "P_PLAZA",
                                       label = "Porcentaje de sucursales en plaza con caídas",
                                       value = 30,
                                       min = 0,  max = 100),
                           sliderInput(inputId = "P_ESTADO",
                                       label = "Porcentaje de sucursales en estado con caídas",
                                       value = 30,
                                       min = 0,  max = 100),
                           sliderInput(inputId = "P_ZONA",
                                       label = "Porcentaje de sucursales en zona con caídas",
                                       value = 30,
                                       min = 0,  max = 100),
                           sliderInput(inputId = "P_CIUDAD",
                                       label = "Porcentaje de sucursales en ciudad con caídas",
                                       value = 30,
                                       min = 0,  max = 100)
                           ),
                  # tab 3 -------------------------
                  tabPanel("Sucursales", 
                           sliderInput(inputId = "SUCURSALES",
                                       label = "Sucursales en total (mismas tiendas)",
                                       value = 990,
                                       min = 300,  max = 3000),
                           numericInput(inputId = "DISTANCIA_MIN",
                                        label = "Distancia con sucursal más cercana (en metros)",
                                        value = 850,
                                        min = 200,  max = 240000),
                           numericInput(inputId = "DISTANCIA_PROM",
                                        label = "Distancia con promedio contra otras sucursales (en metros)",
                                        value = 18500,
                                        min = 1500,  max = 1000000),
                           sliderInput(inputId = "SUC_PLAZA",
                                       label = "Sucursales en plaza (incluyendo esta)",
                                       value = 20,
                                       min = 0,  max = 900),
                           sliderInput(inputId = "SUC_ESTADO",
                                       label = "Sucursales en estado (incluyendo esta)",
                                       value = 55,
                                       min = 0,  max = 900),
                           sliderInput(inputId = "SUC_ZONA",
                                       label = "Sucursales en zona (incluyendo esta)",
                                       value = 30,
                                       min = 0,  max = 900),
                           sliderInput(inputId = "SUC_CIUDAD",
                                       label = "Sucursales en ciudad (incluyendo esta)",
                                       value = 15,
                                       min = 0,  max = 900))
    ), #fin tabs
    hr(), # soy un delimitador
    helpText("Para consultas: [email protected]"),
    actionButton("goButton","GO")
    ), #fin de sidebar
    mainPanel(
      helpText("Predicción del Modelo"),
      hr(), # soy un delimitador
      tableOutput("productos")

    ) #- mainpanel
  )
  )



server = function(input, output, session){
  Predictores<-reactive({
    if (is.null(input$goButton) || input$goButton == 0){return()}
    isolate({
      input$goButton
      test<-input$LUNES*20
      test2<-input$LUNES*30  
      data.frame("uno" = test, "dos" = test2)
    })
  })
  output$productos<-renderTable({as.data.frame(Predictores())},include.rownames = FALSE )
}

runApp(list(ui = ui, server = server))

Решение для вашего конкретного кода Dropbox

введите здесь описание изображения

person Pork Chop    schedule 04.09.2015
comment
Извините, но я продолжаю получать тот же результат... таблица не появляется, даже если я нажимаю кнопку... - person eflores89; 04.09.2015
comment
Я включил подробный пример и вывод, чтобы показать, что я имею в виду. - person Pork Chop; 04.09.2015
comment
Спасибо, это работает автономно, но не с моим приложением, я предполагаю, что тогда это что-то особенное с моим пользовательским интерфейсом. В частности, я думаю, что моя кнопка действия не отправляет или не меняет свой статус, знаете ли вы, возможно ли это? - person eflores89; 04.09.2015
comment
вот файлы, если вы хотите посмотреть сервер: dropbox. com/s/kja67u6qavdspe8/server.R?dl=0 , ui: dropbox.com/s/6a80snc19d9wv2j/ui.R?dl=0 - person eflores89; 04.09.2015
comment
Рад помочь :)) - person Pork Chop; 04.09.2015