Можно ли создать пользовательскую функцию, которая принимает реактивные объекты в качестве входных данных?Как мне это сделать? - PullRequest
0 голосов
/ 24 мая 2019

Итак, я был на Google в течение нескольких часов без ответа.

Я хочу создать пользовательскую функцию на стороне сервера, которая принимает входные данные, которые, как я уже знаю, для оборачивания реактивных ({input $ feature)}, но проблема заключается в том, как включить реактивные значения в качестве входных данных.

Причина, по которой я хочу это сделать, заключается в том, что у меня есть страница navbarPage с несколькими вкладками, которые совместно используют такие элементы, как одни и те же графики. Поэтому я хочу пользовательскую функцию, которая создает все похожие фильтры и не должна создавать несколько одинаковых реактивных выражений с разными именами входных и реактивных переменных, которые занимают более 2000 строк кода.

server <- function(input, output) {

filtered_JointKSA <- reactiveVal(0)

create_filtered_data <- function(df, input_specialtya, filtered_JointKSA) {

    if (input_specialtya == 'manual') {

      data <- filter(data, SPECIALTY %in% input_specialtyb)

    }

    if (filtered_JointKSA != 0) {

      data <- filter(data, SPECIALTY %in% filtered_JointKSA)
    }

 reactive({return(data)})
}

  filtered_data <- create_filtered_data(df, 
                                         reactive({input$specialty1}),
                                         filtered_JointKSA())


  observeEvent(
    eventExpr = input$clickJointKSA, 
    handlerExpr = {

      A <- filtered_JointKSA(levels(fct_drop(filtered_data()$`Joint KSA Grouping`))[round(input$clickJointKSA$y)])
      A

    }
  )



Это вызывает у меня ошибку:

"Ошибка в совпадении (x, таблица, nomatch = 0L): 'match' требует аргументов вектора "

Ошибка исчезнет, ​​если я закомментирую, где пытаюсь создать фильтр_данных, но ни один из моих графиков не создается, потому что фильтр_данных () не найден.

Каков правильный подход к этому?

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

1 Ответ

0 голосов
/ 24 мая 2019

Этот пример может оказать некоторую помощь, но трудно понять без рабочего примера. Изменение состоит в том, чтобы заключить вызов вашей функции в reactive({}), а не во входы этой функции, чтобы все входы реагировали на ввод пользователя и функция обновлялась.

library(shiny)

ui <- fluidPage(
  numericInput("num", "Number", value = NULL),
  verbatimTextOutput("out")
)

server <- function(input, output){

  ## User-defined function, taking a reactive input
  rvals <- function(x){
    req(input$num)
    if(x > 5){x * 10} else {x*1}
  }

  # Call to the function, wrapped in a reactive
  n <- reactive({ rvals(input$num) })

  # Using output of the function, which is reactive and needs to be resolved with '()'
  output$out <- renderText({ n() })

}

shinyApp(ui, server)
...