2015-02-11 27 views
0

我的Shiny應用程序有一個問題。首先,我有兩個dataframes其中有兩個numeric列(numbernumber2)。我也有動態UI sliderInput。閃亮的應用程序工作正常,直到...當我選擇Item數據幀時,請在Y-axis variable中選擇number並在sliderInput之間設置range。 15和18,之後,我想改變Y-axis variablenumber2我得到一個錯誤:
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") 
    }) 

更新 ------------------- -------------------------------------------------- ------------------------------

同樣當我設置的範圍不包含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 2015-02-11 22:19:36

+1

@Nicolabo,很高興幫助。如果這解決了你的問題,請記得接受答案:) – cdeterman 2015-02-11 22:21:33

+0

在ggvis中使用'navbarPage'怎麼樣?是否有可能(我在這裏描述我的問題。http://stackoverflow.com/questions/28474903/navbar-page-and-wrong-update-of-ggvis-plot-shiny – Nicolabo 2015-02-12 10:24:18