根据用户输入Shiny设置数据框

时间:2014-02-02 20:30:36

标签: r subset shiny

我正在尝试构建一个Shiny应用程序,该应用程序将数据框子集化(仅包含分类变量与UI的用户选择输入匹配的行),然后在服务器中处理数据,然后在UI中进行可视化。我尝试了几种不同的方法,但我一直在收到错误,例如: “类型'闭包'的对象不是子集”

然后当我尝试使用

转换被动用户输入时
target <- toString(reactive({input$value}))

我收到以下错误:

“as.vector中的错误(x,”character“):无法强制将'闭包'强制类型为'character'类型的向量”

有什么想法吗?我认为我缺少一些概念性的东西。这是我的代码:

#Server
shinyUI(pageWithSidebar(

headerPanel("Pricing Analysis Tool"),

sidebarPanel(
selectInput("fruit", "Select fruit:", 
            choices = c(inventory), selected = "banana", multiple = FALSE),
numericInput("delta", "Price Change (%):", 10),
submitButton("Run Simulation")),

mainPanel(
plotOutput("PricePlot")
)))


#server
shinyServer(function(input, output, session) {

target_inventory <- reactive({inventory$product == input$fruit})
...

})

一旦我的库存数据只是包含我正在评估的产品的子集,那么我将使用renderPlot生成图表。我正在根据用户输入挂断子集。我是否应该使用其他方法根据用户输入动态子集大型数据集?

非常感谢你的帮助, 诺亚

更新:我能够根据变量用户输入成功对数据进行子集化,然后操作子集并使用我的服务器文件中的代码将其可视化(谢谢你,nivangio,用于发布我用作模板的代码) R-blogger:http://www.r-bloggers.com/dashboards-in-r-with-shiny-and-googlevis/

target_inventory <- reactive({
    a <- subset(inventory, inventory$product %in% input$fruit)
    a <- droplevels(a)
return(a)
})

创建子集后,我可以在动态图中将其用作target_inventory()

1 个答案:

答案 0 :(得分:9)

我遇到了同样的问题,花了几个小时试图解决这个问题。一旦分配了反应对象,就需要使用target_inventory()来引用它(如注释部分中提到的BenBarnes)。

这是一个MWE(最低工作示例)

ui.R

#ui
library(shiny)

shinyUI(fluidPage(
  #User dropbox
  selectInput("state", "Choose state", choices=c("MA", "CA", "NY"))
  #Print table to UI
  ,tableOutput("table1")
))

server.r

 #server
library(shiny)

shinyServer(function(input,output){

  category <- c("MA", "CA", "NY")
  population <- c(3,8,4)

  df <- data.frame(category,population)

  df_subset <- reactive({
    a <- subset(df, category == input$state)
    return(a)
  })

  output$table1 <- renderTable(df_subset()) #Note how df_subset() was used and not df_subset


})