【问题标题】:How to use reactive values in substr?如何在 substr 中使用反应值?
【发布时间】:2019-06-22 22:02:05
【问题描述】:

我的闪亮应用出现问题。我希望用户可以输入 substr 函数所需的所有变量,以使用 dplyr 从数据框中过滤数据。

我使用数据框 iris 做了一个示例。

在 textInput(select1) 中,我喜欢输入“物种”。 在 numericInput(start1) 中,我喜欢输入“4”。 在 numericInput(end1) 我喜欢输入“6”。 在 textInput(match1) 中,我喜欢输入“osa”。

现在我希望 tableOutput 仅显示与“物种”列中第 4 位到第 6 位的条件“osa”匹配的行。

numericInput(start1)、numericInput(end1) 和 textInput(match1) 正在工作。但是 textInput(select1) 不起作用。当我使用输入作为变量时,我得到一个空数据框。

当我在 substr 函数中将代码更改为“Species”中的类型而不是 reactivevar1() 时,我得到了我想要的数据框。

例子:

filter(substr(Species, reactivevar2(), reactivevar3()) == reactivevar4())

这种替代方法有效。但这不是我想要的。

我想让这个工作:

filter(substr(reactivevar1(), reactivevar2(), reactivevar3()) == reactivevar4())

我尝试了不同的函数,例如 substring 和 stringr::str_sub。我也试过 as.character。

这是完整的例子:

library(shiny)
library(dplyr)

ui = fluidPage(
  textInput(inputId="select1", label="Type in variable", value = "", width = NULL, placeholder = NULL),
  numericInput(inputId="start1", label="Start digit", value=NULL, min = NA, max = NA, step = NA,
               width = NULL),
  numericInput(inputId="end1", label="End digit", value=NULL, min = NA, max = NA, step = NA,
               width = NULL),
  textInput(inputId="match1", label="Criteria to match", value = "", width = NULL, placeholder = NULL),
  actionButton(inputId="startfil", label="Start filter", icon = NULL, width = NULL),

  tableOutput('table')

)
server = function(input, output,session) {

  obs <- observeEvent(input$startfil, {

  var1 <- NA
    reactivevar1 <- reactive({
    var1 <- input$select1
    return(var1)})

  var2 <- NA
  reactivevar2 <- reactive({
    var2 <- input$start1
    return(var2)})

  var3 <- NA
  reactivevar3 <- reactive({
    var3 <- input$end1
    return(var3)})

  var4 <- NA
  reactivevar4 <- reactive({
    var4 <- input$match1
    return(var4)})


  irisfiltered <- iris %>%
    filter(substr(reactivevar1(), reactivevar2(), reactivevar3()) == reactivevar4()) #reactivevar1() doesn't work
  output$table <- renderTable(irisfiltered)

  })

}

shinyApp(ui = ui, server = server)

我只是无法弄清楚我的代码有什么问题。重要的是用户可以输入开始和结束数字来过滤子字符串。

【问题讨论】:

    标签: r shiny dplyr


    【解决方案1】:

    欢迎来到 SO! reactivevar1() 的值为“Species”,因此您的 substr 函数返回“cie”。和

    substr(reactivevar1(), reactivevar2(), reactivevar3()) == reactivevar4()
    

    返回FALSE,当您在reactivevar4() 中键入“osa”时

    您可以像这样在管道语句中使用get

    irisfiltered <- iris %>%
          filter(substr(get(reactivevar1()), reactivevar2(), reactivevar3()) == reactivevar4())
    output$table <- renderTable(irisfiltered)
    

    或者使用!!as.name

        iris %>%
            filter(substr(!!as.name(reactivevar1()), reactivevar2(), reactivevar3()) == reactivevar4())
     output$table <- renderTable(irisfiltered)
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多