An attachment of two observed elements duplicates a reactive event

This question is related to another, which I decided several days ago.

My intention:

  • To load csv with multiple columns.
  • Plan each column in a row and on a graph.
  • Allow the user to select two different points from the graph, called the first / last. The program always gets the last two clicks so that they find the first / last (first <= last).

Since the columns may differ from one data set to another, I have to dynamically create the structure of the application, and the problem is that I set a watch element to click on each chart inside the watch object (when the user changes the input data set). The problem is that the watch item for a click depends on the loaded dataset (different columns).

What I do in the application is to create a pool with all the clicks on all the graphs and extract all the last two from each graph when necessary, and I use this information to change the graph with green and red colors.

To create two sets of data sets:

inputdata<-data.frame(weekno=1:20, weekna=letters[1:20])
inputdata$normal<-dnorm(inputdata$weekno,10)
inputdata$beta<-dbeta(inputdata$weekno, 1, 1)
inputdata$gamma<-dgamma(inputdata$weekno, 1, 1)
inputdata$logistic<-dlogis(inputdata$weekno,10)
inputdata$poisson<-dpois(inputdata$weekno, 2)
test1<-inputdata[c("normal","gamma")]
row.names(test1)<-inputdata$weekna
test2<-inputdata[c("normal","logistic")]
row.names(test2)<-inputdata$weekna
write.csv(test1, file="test1.csv")
write.csv(test2, file="test2.csv")

Application:

library(ggplot2)
library(shiny)
library(shinydashboard)

tail.order<-function(i.data, i.n, i.order){
  res<-tail(i.data, n=i.n)
  res<-res[order(res[i.order]),]
  res$id.tail<-1:NROW(res)
  res
}

extract.two<-function(i.data, i.order, i.column){
  #data<-unique(i.data, fromLast=T)
  data<-i.data
  results <- do.call("rbind", by(data, data[i.column], tail.order, i.n=2, i.order=i.order))
  return(results)
}

ui <- fluidPage(
  fluidRow(
    column(4,fileInput('file', "Load file")),
    column(8,uiOutput("maintab"))
  )
)

server <- function(input, output) {

  values <- reactiveValues(origdata = NULL, plotdata = NULL, clickdata=NULL, dummy = TRUE)

  read_data <- reactive({
    infile <- input$file
    inpath <- infile$datapath
    inname <- infile$name
    if(is.null(infile)) readdata<-NULL else readdata<-read.csv(inpath, row.names=1)
    readdata
  })

  observeEvent(input$file, {
    datfile <- read_data()
    seasons<-names(datfile)
    plotdata<-cbind(data.frame(weekno=1:NROW(datfile),weekna=rownames(datfile), stringsAsFactors = F), datfile)
    origdata<-plotdata
    for (s in seasons) eval(parse(text=paste0("plotdata$'",as.character(s),"_color'<-'1'")))
    values$origdata <- origdata
    values$plotdata <- plotdata
    values$clickdata <- data.frame()
    rm("origdata", "plotdata")
    lapply(seasons, function(s){output[[paste0("plot_",as.character(s))]] <- renderPlot({
      ggplot(values$plotdata, aes_(x=as.name("weekno"), y=as.name(s))) +
        geom_point(aes_(as.name("weekno"), as.name(s), colour=as.name(paste0(s,"_color")), size=as.name(paste0(s,"_color")))) +
        scale_color_manual(values = c("1" = "grey", "2" = "red", "3" = "green")) +
        scale_size_manual(values = c("1" = 4, "2" = 6, "3" = 6)) +
        geom_line(aes_(x=as.name("weekno"), y=as.name(s)), color="#000000") +
        ggthemes::theme_few() +
        guides(color=FALSE, size=FALSE)
    })})
    lapply(seasons,function(s){
      observeEvent(input[[paste0("plot_",as.character(s),"_click")]], {
        np <- nearPoints(values$origdata, input[[paste0("plot_",as.character(s),"_click")]], maxpoints=1 , threshold = 10000)
        values$clickdata<-rbind(values$clickdata,cbind(data.frame(variable=as.character(s), stringsAsFactors = F), np))
        if (NROW(values$clickdata)>0){
          p0<-extract.two(values$clickdata,"weekno","variable")
          p1<-subset(p0, variable==as.character(s) & id.tail==1)
          p2<-subset(p0, variable==as.character(s) & id.tail==2)
          if (NROW(p1)>0) {
            values$plotdata[values$plotdata[,paste0(as.character(s),"_color")]=="2", paste0(as.character(s),"_color")]<-"1"
            values$plotdata[values$origdata$weekno==p1$weekno,paste0(as.character(s),"_color")]<-"2"
          }
          if (NROW(p2)>0){
            values$plotdata[values$plotdata[,paste0(as.character(s),"_color")]=="3",paste0(as.character(s),"_color")]<-"1"
            values$plotdata[values$origdata$weekno==p2$weekno,paste0(as.character(s),"_color")]<-"3"
          }
        }
      })
    })
  })

  output$maintab <- renderUI({
    datfile <- read_data()
    seasons<-names(datfile)
    do.call(tabsetPanel,
            c(
              lapply(seasons,function(s){
                call("tabPanel",s,call("plotOutput", outputId=paste0("plot_",as.character(s)),
                                       click = paste0("plot_",as.character(s),"_click")))
              }),
              list(
                tabPanel("First & last",tableOutput("results")),
                tabPanel("Clicks",tableOutput("resultsfull"))
              )
            )
    )
  })

  output$results<-renderTable({
    if (NROW(values$clickdata)>0) extract.two(values$clickdata,"weekno","variable")
  })

  output$resultsfull<-renderTable({
    values$clickdata
  })

}

shinyApp(ui, server)

To reproduce the error:

test1.csv, ( "_click" ). test2.csv, ( "_click" ).

test1.csv test2.csv "", observEvent $normal_click , , , , " " ( , "normal_click".

" ", (, , , ).

, , :

#data<-unique(i.data, fromLast=T)

, , ( ). , .

, ?

0
1

, .

, , ( idscreated).

library(ggplot2)
library(shiny)
library(shinydashboard)

tail.order<-function(i.data, i.n, i.order){
  res<-tail(i.data, n=i.n)
  res<-res[order(res[i.order]),]
  res$id.tail<-1:NROW(res)
  res
}

extract.two<-function(i.data, i.order, i.column){
  data<-i.data
  results <- do.call("rbind", by(data, data[i.column], tail.order, i.n=2, i.order=i.order))
  return(results)
}

ui <- fluidPage(
  fluidRow(
    column(4,fileInput('file', "Load file")),
    column(8,uiOutput("maintab"))
  )
)

server <- function(input, output) {

  values <- reactiveValues(origdata = NULL, plotdata = NULL, clickdata=NULL, idscreated = character())

  read_data <- reactive({
    infile <- input$file
    inpath <- infile$datapath
    inname <- infile$name
    if(is.null(infile)) readdata<-NULL else readdata<-read.csv(inpath, row.names=1)
    readdata
  })

  observeEvent(read_data(), {
    datfile <- read_data()
    seasons<-names(datfile)
    plotdata<-cbind(data.frame(weekno=1:NROW(datfile),weekna=rownames(datfile), stringsAsFactors = F), datfile)
    origdata<-plotdata
    for (s in seasons) eval(parse(text=paste0("plotdata$'",as.character(s),"_color'<-'1'")))
    values$origdata <- origdata
    values$plotdata <- plotdata
    values$clickdata <- data.frame()
    rm("origdata", "plotdata")
    lapply(seasons, function(s){output[[paste0("plot_",as.character(s))]] <- renderPlot({
      ggplot(values$plotdata, aes_(x=as.name("weekno"), y=as.name(s))) +
        geom_point(aes_(as.name("weekno"), as.name(s), colour=as.name(paste0(s,"_color")), size=as.name(paste0(s,"_color")))) +
        scale_color_manual(values = c("1" = "grey", "2" = "red", "3" = "green", "4" = "purple")) +
        scale_size_manual(values = c("1" = 4, "2" = 6, "3" = 6, "4" = 8)) +
        geom_line(aes_(x=as.name("weekno"), y=as.name(s)), color="#000000") +
        ggthemes::theme_few() +
        guides(color=FALSE, size=FALSE)
    })})
    lapply(seasons,function(s){
      nameid<-paste0("plot_",as.character(s),"_click")
      if (!(nameid %in% values$idscreated)){
        values$idscreated<-c(values$idscreated,nameid)
      observeEvent(input[[nameid]], {
        np <- nearPoints(values$origdata, input[[nameid]], maxpoints=1 , threshold = 10000)
        values$clickdata<-rbind(values$clickdata,cbind(data.frame(variable=as.character(s), stringsAsFactors = F), np))
        if (NROW(values$clickdata)>0){
          p0<-extract.two(values$clickdata,"weekno","variable")
          p1<-subset(p0, variable==as.character(s) & id.tail==1)
          p2<-subset(p0, variable==as.character(s) & id.tail==2)
          if (NROW(p1)>0) {
            values$plotdata[values$plotdata[,paste0(as.character(s),"_color")]!="3", paste0(as.character(s),"_color")]<-"1"
            values$plotdata[values$origdata$weekno==p1$weekno,paste0(as.character(s),"_color")]<-"2"
          }
          if (NROW(p2)>0){
            values$plotdata[values$plotdata[,paste0(as.character(s),"_color")]!="2", paste0(as.character(s),"_color")]<-"1"
            values$plotdata[values$origdata$weekno==p2$weekno,paste0(as.character(s),"_color")]<-"3"
          }
          if (NROW(p1)>0 & NROW(p2)>0){
            if (p1$weekno==p2$weekno){
              values$plotdata[, paste0(as.character(s),"_color")]<-"1"
              values$plotdata[values$origdata$weekno==p1$weekno,paste0(as.character(s),"_color")]<-"4"
            }
          }

        }
      })
      }

    })
  })

  output$maintab <- renderUI({
    datfile <- read_data()
    seasons<-names(datfile)
    do.call(tabsetPanel,
            c(
              lapply(seasons,function(s){
                call("tabPanel",s,call("plotOutput", outputId=paste0("plot_",as.character(s)),
                                       click = paste0("plot_",as.character(s),"_click")))
              }),
              list(
                tabPanel("First & last",tableOutput("results")),
                tabPanel("Clicks",tableOutput("resultsfull"))
              )
            )
    )
  })

  output$results<-renderTable({
    if (NROW(values$clickdata)>0) extract.two(values$clickdata,"weekno","variable")
  })

  output$resultsfull<-renderTable({
    values$clickdata
  })

}

shinyApp(ui, server)
0

Source: https://habr.com/ru/post/1619047/


All Articles