如何在substr中使用无功值?

时间:2019-01-29 17:43:06

标签: r shiny dplyr

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

我以数据帧虹膜为例。

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

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

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

当我更改代码的类型而不是substr函数中的reactvar1()时,将获得所需的数据帧。

示例:

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)

我只是无法弄清楚我的代码出了什么问题。用户必须输入一个开始和一个结束数字以过滤子字符串,这一点很重要。

1 个答案:

答案 0 :(得分:0)

欢迎您! reactivevar1()的值为“ Species”,因此您的substr函数返回“ cie”。还有

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

FALSE中键入“ osa”即返回reactivevar4()

您可以像这样在管道语句中使用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)

希望这会有所帮助