Как использовать реактивные значения в substr? - PullRequest
0 голосов
/ 29 января 2019

У меня проблемы с моим блестящим приложением.Я хочу, чтобы пользователь мог ввести все переменные, необходимые для функции substr, чтобы отфильтровать данные из фрейма данных с помощью dplyr.

Я сделал пример с использованием радужной оболочки данных.

В textInput(выберите1) Мне нравится вводить "Виды".В numericInput (start1) мне нравится вводить «4».В numericInput (end1) мне нравится вводить «6».В textInput (match1) мне нравится вводить «osa».

Теперь я хочу, чтобы tableOutput отображал только те строки, которые соответствуют критериям «osa» в столбце «Виды» от цифры 4 до 6.

Работают numericInput (начало1), numericInput (конец1) и textInput (match1).Но textInput (select1) не работает.Когда я использую входные данные как переменную, я получаю пустой фрейм данных.

Когда я меняю код, тип в «Species» вместо реактивнойvar1 () в функции substr, я получаю фрейм данных Iхочу.

Пример:

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 голосов
/ 29 января 2019

Добро пожаловать на ТАК!reactivevar1() имеет значение "Species", поэтому ваша функция substr возвращает "cie".И

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

возвращает FALSE, когда вы набираете ie "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)

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...