是否可以创建一个将反应对象作为输入的用户定义函数?我该怎么做?

时间:2019-05-24 14:49:24

标签: r function shiny reactive

所以,我已经在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

    }
  )



这给我一个错误:

“ match(x,table,nomatch = 0L)中的错误:   “匹配”需要向量参数”

如果我注释掉尝试在哪里创建filtered_data的位置,但由于未找到filterd_data()而未创建任何图,则错误消失了。

正确的方法是什么?

理想情况下,如果方法具有不同的方法,我也希望我的observerEvents也可以包含在用户定义的函数中。

1 个答案:

答案 0 :(得分:0)

该示例可能会提供一些帮助,但是如果没有有效的示例,很难说清楚。所做的更改是将对函数的调用包装在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)