在另一个反应式中使用反应式函数

Using a reactive function inside another reactive

我是 shiny 的反应部分的新手。我曾尝试编写一个代码,其中有一个很大的反应函数,并且在其中我有另一个反应函数,它根据滑块输入而变化。是否可以在另一个内部编写一个反应式,因为如果是我的代码则不会 运行?在另一个反应式中编写一个反应式是一种好习惯吗?

这是我的代码:

dt <- reactive({
    con = dbConnect(MySQL(), user='root', password='root', db='simulator', host='localhost')
    size <- reactive({dbGetQuery( con, statement = paste(" Select count(*) from event where event_type = 'pe_send_flit' and run_id = ",input$run))})
    j = (size()$`count(*)`) - 1
    a <- j
    b <- j
    for(i in 0:j)
    {
      a[i] <- dbGetQuery(con, statement = paste(" Select event_time from event where event_type = 'pe_receive_flit' and run_id = ",input$run," and event_data =", i,"order by event_data asc"))
      b[i] <- dbGetQuery(con, statement = paste(" Select event_time from event where event_type = 'pe_send_flit' and run_id = ",input$run," and event_data =",i,"order by event_data asc"))
    }
    receive <- as.vector(a,mode='numeric')
    send <- as.vector(b,mode='numeric')
    difference = receive - send
    len = length(difference)
    avg = 0.0
    sum_f = 0
    counter = 1
    xrange <- vector(mode = "numeric", length = len)
    yrange <- vector(mode = "numeric", length = len)
    for (k in 1:len)
    {
      temp = receive[k]
      sum_f = difference[k]
      l = k + 1
      for(m in l:len)
      {
        if(isTRUE(all.equal(temp,receive[m])))
        {
          sum_f = sum_f + difference[m]
          counter = counter + 1
          receive[m] = 0
          difference[m] = 0
        }
      }
      avg = sum_f/counter
      xrange[k] = receive[k]
      yrange[k] = avg
    }
    xrange <- xrange[xrange!=0]
    yrange <- yrange[yrange!=0.000]
    xrange <- xrange[!is.na(xrange)]
    yrange <- yrange[!is.na(yrange)]
    array_length = length(xrange)
    ind <- sort(xrange,index.return = TRUE)$ix
    xrange <- xrange[ind]
    yrange <- yrange[ind]
    myfunction <- function(pa,val,x)
    {
      y = x - 1
      tmp = pa*y
      sm = tmp + val
      incr = y + 1
      result = sm/incr
      return(result)
    }
    incremental_average <- vector(mode = "numeric",length = array_length)
    pa = as.integer(0)
    for(r in 1:array_length)
    {
      pa = myfunction(pa,yrange[r],r)
      incremental_average[r] = pa
    }
    dbDisconnect(con)
    df <- data.frame(xrange,incremental_average)
    dat <- reactive({
      if(!is.null(input$range))
      {
        test <- df[df$xrange %in% seq(from=input$range[1],to=input$range[2]),]
        test
      }
    })

    df
  })

如何使用 'dat' 反应部分?

把这个拉出来重写为

dat <- reactive({
    if(!is.null(input$range)) {
        test <- dt()[dt()$xrange %in% seq(from=input$range[1],to=input$range[2]),]
        test
    }
})

现在你的 dt() 函数 returns 数据(实际上只是加载它)但是你的 dat() 函数 returns 过滤数据。