Динамический объект ggvis в Shiny

Я пытаюсь добавить динамический график ggvis в приложение Shiny. Сначала пользователь выбирает измерение, а затем добавляет элементы из этого измерения.

Global.R и примеры данных см. на странице https://gist.github.com/tts/a41c8581b9d77f131b31

сервер.R:

shinyServer(function(input, output, session) {


  # Render a selectize drop-down selection box 
  output$items <- renderUI({

    selectizeInput(
      inputId = 'items', 
      label = 'Select max 4. Click to delete',
      multiple = TRUE,
      choices = aalto_all[ ,names(aalto_all) %in% input$dim],
      options = list(maxItems = 4, placeholder = 'Start typing')
    )

  })


  selected <- reactive({

    if (is.null(input$items)) {
      return(aalto_all)
    }
    df <- aalto_all[aalto_all[[input$dim]] %in% input$items, ]
    df$keys <-seq(1, nrow(df))
    df

  })


  selected %>% 
    ggvis(~WoS, ~NrOfAuthors, fill = ~School, key := ~keys) %>%
    layer_points() %>%
    add_tooltip(show_title) %>%
    bind_shiny("gv")


  show_title <- function(x=NULL) {
    if(is.null(x)) return(NULL)
    key <- x["keys"][[1]]
    selected()$Title20[key]
  }  


})

ui.R:

shinyUI(fluidPage(

  titlePanel('Some (alt)metric data for articles published since 2010'),

  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "dim", 
        label = "Dimension", 
        choices = dimensions,
        selected = c("Title")),
      uiOutput("items")
      ),


    mainPanel(

      tabsetPanel(
        # I'll add more tabs
        tabPanel("Plot with ggvis", ggvisOutput("gv"))
      )
    )
  )
))

Хорошо

  1. в начале, когда нет выбранных элементов, и все данные выводятся на график. Это хак, потому что объект ggvis выдает ошибку, если нет обслуживаемых данных.
  2. когда все выбранные элементы удаляются (то же самое, что и 1.) и выбирается другое измерение

Но когда я пытаюсь переключиться на другое измерение без предварительного удаления элементов, я получаю следующее:

Error in `$<-.data.frame`(`*tmp*`, "keys", value = c(1L, 0L)) : 
replacement has 2 rows, data has 0

Я понимаю, что ggvis очень новый и постоянно развивается, но я подозреваю, что в реактивных значениях Shiny просто что-то не синхронизировано. Если кто-то может указать, что я делаю неправильно, большое спасибо!


person tts    schedule 03.07.2014    source источник


Ответы (1)


Ошибка вызвана тем, что у вас есть data.frame с нулевыми строками и результирующий 1:0. Вы можете изменить свою функцию selected на:

 selected <- reactive({
    if (is.null(input$items)) {
      return(aalto_all)
    }
    df <- aalto_all[aalto_all[[input$dim]] %in% input$items, ]
    df$keys <-seq_along(df[,1])
    if(nrow(df) == 0){
      return(aalto_all)
    }
    df
  })
person jdharrison    schedule 03.07.2014
comment
да, это было! Действующее приложение по адресу ttso.shinyapps.io/AaltoAltm и код gist.github.com/tts/5df86b664b840c5927f9 - person tts; 04.07.2014
comment
Рад помочь. Приложение выглядит очень красиво. - person jdharrison; 04.07.2014
comment
@tts, если это отвечает на ваш вопрос, рассмотрите возможность отметить вопрос, на который был дан ответ, отметив ответ галочкой. - person jdharrison; 04.07.2014