在另一个被动

时间:2017-04-20 09:16:40

标签: r shiny reactive

我是新生的闪亮的反应部分。我尝试编写一个代码,其中有一个很大的反应函数,在里面,我有另一个反应函数,它根据滑块输入而改变。是否有可能在其他内部写一个被动反应,因为如果是我的代码不运行?在另一个反应中写入反应是否是一个好习惯?

这是我的代码:

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'反应部分?

1 个答案:

答案 0 :(得分:0)

将此位拉出并重写为

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

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