在 R Shiny 中:如何分离滑块输入值并用它们进行筛选

In R Shiny How to Separate Slider Input Values and Filter with them

提问人:Hack-R 提问时间:1/5/2015 最后编辑:Hack-R 更新时间:8/30/2018 访问量:6116

问:

在 R 的包中,您可以使用一个具有上限和下限的滑块小部件。shinysliderInput

我希望能够将上限值和下限值分开,并在将数据传递给之前用它们过滤一列数据。UI.R

例如:

服务器.R

library(shiny)
data <- read.csv('some_data_to_filter.csv')

# Define server logic for slider examples
shinyServer(function(input, output) {

  # Reactive expression to compose a data frame containing all of
  # the values
  sliderValues <- reactive({

    # Compose data frame
    data.frame(
      Name = c("Range"),
      Value = as.character(c(paste(input$range, collapse=' '),)), 
      stringsAsFactors=FALSE)
  }) 

  # Show the values using an HTML table
  output$values <- renderTable({
    sliderValues()
  })
})

用户界面。R

library(shiny)    
# Define UI for slider demo application
shinyUI(fluidPage(

  #  Application title
  titlePanel("Sliders"),

  sidebarLayout(
    sidebarPanel(      
  # Specification of range within an interval
      sliderInput("range", "Range:",
                  min = 1, max = 1000, value = c(200,500))
),

    # A table summarizing the values entered
    mainPanel(
      tableOutput("values")
    )
  )
))

在上面的示例中,我读取了数据,并且有一个滑块,但是没有像我想要的那样对数据进行过滤。

这是我拆分和过滤的最佳尝试,但它抛出了一个错误:

myrange <- reactive({ data.frame(strsplit(Value = input$slider))})
data <- data[data$colname <= as.numeric(myrange[2]),]
data <- data[data$colname >= as.numeric(myrange[2]),]
R 小部件 闪亮

评论

0赞 Marat Talipov 1/5/2015
为什么需要,这不是字符向量?strsplitinput$slider
0赞 Hack-R 1/5/2015
这个想法是拆分生成的字符串,但滑块范围。slider 对象生成的范围/字符串如下所示。通过使用,您通常可以在 R 中将其转换为向量的单独元素,但是这是反应式的这一事实使事情变得复杂。您知道将两个数字分开的方法,以便它们可用于子集数据吗?"50 100"data.frame(unlist(strsplit()))input$slider
1赞 Marat Talipov 1/5/2015
我不认为你真的需要它。 已经是长度为 2 的数值向量,其中包含最小值和最大值,例如 .这意味着 and 将为您提供左右滑块值。input$rangenum [1:2] 200 614input$range[1]input$range[2]
0赞 Hack-R 1/5/2015
好的,太好了!我认为我们几乎找到了解决方案,但是当我像这样尝试时,它说data <- reactive({data[data$somecolumn <= input$range[2],]})Error in x[subset & !is.na(subset)] : object of type 'closure' is not subsettable
0赞 Marat Talipov 1/5/2015
请注意,您同时用作数据集 () 的名称和反应式表达式 () 的名称,这会导致错误。将反应式表达式重命名为类似 。datadata <- read.csv('some_data_to_filter.csv')data <- reactive(...)data.subset <- reactive(...)

答:

6赞 Pork Chop 1/9/2015 #1

如果我理解您的问题正确,您希望根据滑块输入权限的两个限制对数据进行子集化。如果是这样,请将以下解决方案与示例数据一起使用

library(shiny)

# Sample Data
area <- seq(from=10,to=100, by=10);peri <- seq(from=2710.1,to=2800.1, by=10)
shape <- seq(from=0.1,to=1, by=0.1);perm <- seq(from=1,to=100, by=10)
my_data <- as.data.frame(cbind(area,peri,shape,perm))

ui = fluidPage(
  sidebarPanel(sliderInput("range", "Select Range",min = 1, max = 10, value = c(2, 5)),width = 3),
  mainPanel(tableOutput("view"))
)

server = function(input, output) {
  output$view <- renderTable({
    test <- my_data[input$range[1]:input$range[2],]
    test},include.rownames=FALSE)
}
runApp(list(ui = ui, server = server))