如何在一个反应​​函数中传递两个输入以基于两者来区分数据

Posted

技术标签:

【中文标题】如何在一个反应​​函数中传递两个输入以基于两者来区分数据【英文标题】:how to pass two inputs in one reactive function to distinguish data on the basis of both 【发布时间】:2018-03-21 12:06:38 【问题描述】:
biz1 = data.frame(

  Stock = query11$MONTHNAME,

  SaleDate=query11$SALE_DATE,
  Total = as.numeric(as.character(query11$TOTAL)),

  NumberOfBills=query11$TRIID,
  year=query11$YEAR,
  stringsAsFactors = FALSE

)      
output$Box3 = renderUI(
        if (USER$Logged==TRUE)
          selectInput("yr","select a year",c(unique(biz1$year),"pick one"),"pick one")
        )

      output$Box4= renderUI(

        if (USER$Logged==TRUE)
        
          if (is.null(input$yr) || input$yr == "pick one")return()
          else selectInput("sector", 
                            "Select a Month", 
                            c(unique(biz1$Stock[which(biz1$year%in%input$yr)]),"pick one"),
                            "pick one")



        )  

这里的 subdata2 是反应函数,我想根据两个输入来区分数据,但我不能以正确的格式传递

  subdata2 = reactive(biz1[which(biz1$Stock%in%input$sector),]&&biz1[which(biz1$Stock%in%input$yr)])

【问题讨论】:

任何帮助如何做到这一点 区分数据是什么意思?请提供一个可重现的例子。 表示如果我选择 10 月作为月份,它会显示 2016 年和 2017 年 10 月的数据,但我只想要 2017 年的数据 【参考方案1】:

由于没有足够的信息并且没有可重复的示例,我试图解决这个问题,假设在 Shiny 中没有产生错误并且问题是对数据进行子集化。

您的数据子集代码

subdata2 = reactive(biz1[which(biz1$Stock%in%input$sector),]&&biz1[which(biz1$Stock%in%input$yr)])

我看到了 3 个错误:

    which(biz1$Stock%in%input$yr),在这里您使用input$yr 值对Stock 列进行子集化 &&& 的使用,这里较长的形式从左到右计算,只检查每个向量的第一个元素。查看?"&&"了解更多信息 which 的使用,在您的代码中,您分别对同一数据框进行子集化,然后将它们与&& 进行比较,而不是您应该,例如。 biz1[which(biz1$Stock %in% input$sector & biz1$year %in% input$yr),]

完整解决方案

library(shiny)

biz1 = data.frame(Stock = 1:12, year = 2016:2017, test = c("a", "b", "c"),
                  stringsAsFactors = FALSE)


ui <- fluidPage(
  uiOutput("Box3"),
  uiOutput("Box4"),
  dataTableOutput("tbl")
)


server <-  function(input, output, session)

  output$Box3 = renderUI(
    selectInput("yr","select a year",c(unique(biz1$year),"pick one"),"pick one")
  )

  output$Box4= renderUI(

    if (is.null(input$yr) || input$yr == "pick one")  
      return()
     else selectInput("sector", 
                       "Select a Month", 
                       c(unique(biz1$Stock[which(biz1$year%in%input$yr)]),"pick one"),
                       "pick one")
  )

  # Note the usage of 'which' and '&' to subset the data frame
  output$tbl <- renderDataTable(
    biz1[which((biz1$Stock%in%input$sector) & (biz1$year%in%as.numeric(input$yr))), ]
  )


shinyApp(ui, server)

【讨论】:

它不工作显示错误:-invalid 'x' type in 'x && y' 我不知道你尝试了什么。你能更详细一点吗?在上面的解决方案中,我没有使用&amp;&amp;,所以我不能说错误来自哪里。【参考方案2】:

您可以使用过滤器 fn

subdata2 = reactive(
  x <- filter(biz1,Stock%in%input$sector, year%in%input$yr)
  x
)

【讨论】:

以上是关于如何在一个反应​​函数中传递两个输入以基于两者来区分数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将支柱传递到反应路由器路由?

以角度将指令/输入传递给孩子的反应方式是啥?

传递参数以在Shiny中渲染函数

角度反应形式 - 验证变化和模糊两者

如何减去两个angularjs日期变量

如何使用向量将多个字符串传递给函数