2015-02-11 3 views
0

У меня есть одна проблема с моим блестящим приложением. Во-первых, у меня есть два dataframes, в которых есть два столбца numeric (number и number2). У меня также есть динамический ui sliderInput. Блестящее приложение отлично работает до тех пор, пока ... когда я выберу Item dataframe, выберите number в Y-axis variable и установите range в sliderInput между, например. 15 и 18, и после этого я хочу изменить Y-axis variable к number2 я получаю ошибку:
Error in eval(substitute(expr), envir, enclos) : wrong result size (2), expected 0 or 1
Я знаю, что эта проблема вызвана тем, что число в number2 колонки находится между 1 и 10 и предыдущими настройками не включен, что числа. Может ли кто-нибудь сказать мне, как улучшить его?реактивные изменения мин./Макс. Диапазон + 2 кадра данных Блестящие

ui.R

library(ggvis) 

shinyUI(fluidPage(

titlePanel(""), 

sidebarLayout(
sidebarPanel(
    radioButtons("dataset", label = h4("Choose dataframe"), 
       choices = list("Item" = "df1", "Task" = "df2")), 
    selectInput("yvar", "Y-axis variable", axis_vars_y, selected = "number"), 
    uiOutput("slider") 
    ), 
mainPanel(
    ggvisOutput("plot") 
) 
) 
)) 

server.R

library(shiny) 
library(dplyr) 
library(magrittr) 
library(lazyeval) 

df1_number <-sample(seq(1,20,0.01),20,replace = T) 
df2_number <-sample(seq(1,20,0.01),20,replace = T) 
df1_number2 <-sample(seq(1,10,0.01),20,replace = T) 
df2_number2 <-sample(seq(1,10,0.01),20,replace = T) 

df1 <- data.frame(name = rep(letters[1:4],each = 5), number = df1_number, number2 = df1_number2) 
df2 <- data.frame(name = rep(letters[1:4],each = 5), number = df2_number, number2 = df2_number2) 
axis_vars_y <- c("number" = "number", "number2" = "number2") 



shinyServer(function(input, output) { 

    datasetInput <- reactive({ 
    switch(input$dataset, 
      df1 = df1, 
      df2 = df2) 
    }) 

    axis_vara_y <- reactive({ 
    switch(input$yvar, 
      number = 2, 
      number2 = 3) 
    }) 

    output$slider <- renderUI({ 
     sliderInput("inslider","Slider", min = min(datasetInput()[,axis_vara_y()]), 
             max = max(datasetInput()[,axis_vara_y()]), 
             value = c(min(datasetInput()[,axis_vara_y()]), 
               max(datasetInput()[,axis_vara_y()])), 
             step = 0.5) 
}) 

    data <- reactive({ 
    filteredData <- datasetInput() 
    if(!is.null(input$inslider)){ 
     filteredData <- filteredData %>% 
     filter(filteredData[,axis_vara_y()] >= input$inslider[1], 
       filteredData[,axis_vara_y()] <= input$inslider[2]) 
    } 
    filteredData 
}) 

    data_two <- reactive({ 
    data() %>% 
     mutate(id = 1:n()) 

    }) 

    vis <- reactive({ 

    yvar_name <- names(axis_vars_y)[axis_vars_y == input$yvar] 
    yvar <- prop("y", as.symbol(input$yvar)) 

    data_two %>% 
     ggvis(x = ~name, y = yvar) %>%  
     layer_points(size := 120, 
        fill = ~name, 
        fillOpacity := 0.6, 
        key := ~id) 

     }) 
     vis %>% bind_shiny("plot") 
    }) 

Update ------------------- -------------------------------------------------- ------------------------------

То же самое error возникает, когда я устанавливаю диапазон, который не содержит значения от number (например, между 13 и 14).

ответ

4

Как вы понимаете, вы получаете ошибку, потому что отфильтрованный набор данных не имеет строк. Простым обходным решением было бы вернуть полный набор данных. Это приведет к сбросу inputSlider, чтобы продолжить работу без ошибок. Вам нужно только изменить свою реактивную функцию data.

data <- reactive({ 
    filteredData <- datasetInput() 
    axisData <- axis_vara_y() 

    if(!is.null(input$inslider)){ 
    filteredData <- filteredData %>% 
     filter(filteredData[,axisData] >= input$inslider[1], 
      filteredData[,axisData] <= input$inslider[2]) 
    } 

    # the new part to reset the slider 
    if(nrow(filteredData) == 0){ 
    return(datasetInput()) 
    }else{ 
    return(filteredData) 
    } 
}) 

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

+0

Tkanks много! Я боролся с ним в течение долгого времени! :) – Nicolabo

+1

@ Николабо, рад помочь. Если это решает вашу проблему, не забудьте принять ответ :) – cdeterman

+0

Как насчет использования 'navbarPage' в ggvis. Возможно ли (я описываю свою проблему здесь. Http://stackoverflow.com/questions/28474903/navbar-page-and-wrong-update-of-ggvis-plot-shiny – Nicolabo