【问题标题】:reactive change min/max range + 2 dataframes Shiny反应性变化最小/最大范围+ 2个数据帧闪亮
【发布时间】:2015-02-12 06:09:32
【问题描述】:

我的 Shiny 应用程序有一个问题。首先,我有两个dataframes,其中有两个numeric 列(numbernumber2)。我也有动态 ui sliderInput。闪亮的应用程序运行良好,直到...当我选择 Item 数据框时,在 Y-axis variable 中选择 number 并在 sliderInput 中设置 range 在例如之间15 和 18,然后我想将 Y-axis variable 更改为 number2 我收到一个错误:
Error in eval(substitute(expr), envir, enclos) : wrong result size (2), expected 0 or 1
我知道这个问题是因为number2 列中的数字在1 到10 之间,并且之前的设置不包括该数字。谁能告诉我如何改进它?

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 之间)时,会发生相同的 error

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    如您所见,您收到错误是因为过滤后的数据集没有行。一个简单的解决方法是返回完整的数据集。这将重置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)
      }
    })
    

    我冒昧地稍微简化了代码,因为您可以分配响应式数据语句,而不必让闪亮的应用程序多次调用它们。

    【讨论】:

    • Tkanks 很多!我挣扎了很久!:)
    • @Nicolabo,很高兴为您提供帮助。如果这解决了您的问题,请记住接受答案:)
    • 在ggvis中使用navbarPage怎么样。有可能吗(我在这里描述了我的问题。stackoverflow.com/questions/28474903/…
    猜你喜欢
    • 2016-11-25
    • 2015-10-10
    • 2015-04-10
    • 2012-05-12
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多