0

The following is just a reprex but i am making an app where the following situation occurs. A reactive() is used inside of reactiveValues(). When i do this i get an error. Check out the line where you see :

dd<-reactive(d1)

DF1 <- reactiveValues(data=dd())

Admit<-c("Admitted","Rejected","Admitted", "Rejected", "Admitted", "Rejected", "Admitted",
         "Rejected","Admitted", "Rejected", "Admitted","Rejected","Admitted", "Rejected","Admitted","Rejected", "Admitted", "Rejected",
         "Admitted","Rejected", "Admitted" ,"Rejected","Admitted", "Rejected")
Gender<-c("Male","Male","Female","Female", "Male",   "Male",   "Female", "Female", "Male","Male","Female","Female",
          "Male","Male","Female","Female","Male",   "Male",   "Female", "Female","Male","Male","Female","Female")
Dept<-c( "A","A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "F", "F", "F", "F")
Freq<-c("512", "313",  "89",  "19", "353", "207",  "17",   "8", "120", "205", "202", "391", "138", "279", "131", "244",  "53", "138",
        "94", "299",  "22", "351",  "24", "317")

banking.df<-data.frame(Admit,Gender,Dept, Freq,stringsAsFactors = FALSE)
d1 = banking.df
d1$Date = Sys.time() + seq_len(nrow(d1))

library(shiny)
library(DT)

ui <- fluidPage(
  titlePanel("UC Berkley Admissions"),
  
  mainPanel(
    tabsetPanel(
      id = 'dataset',
      tabPanel("Sample Bank",
               
               DT::DTOutput("banking.df_data"),
               tableOutput('table'),
               
               br(),
               actionButton("saveBtn","Save"),
               br(),
               actionButton(inputId = "reset", label = "Reset")
               
      ))))

server <- function(input, output) {
  dd<-reactive(d1)
  DF1 <- reactiveValues(data=dd())

  output$banking.df_data<-renderDT(
    DF1$data, editable = TRUE
    
   
  )
  
  observeEvent(input$banking.df_data_cell_edit, {
    req(input$banking.df_data_cell_edit)
    d1[input$banking.df_data_cell_edit$row,input$banking.df_data_cell_edit$col] <<- input$banking.df_data_cell_edit$value
    DF1$data <- d1
  })
  output$table <- renderTable(DF1$data)
  
  
  

  
}

shinyApp(ui = ui, server = server)
3
  • OK, but why you can't just use DF1 <- reactiveValues(data=d1)? And remove this: dd<-reactive(d1)? Commented Mar 4, 2022 at 9:15
  • In my actual shiny app , a dataframe comes from a reactive() function which is then used in multiple places. In the reactive() function i get the data from rhandsontable package Commented Mar 4, 2022 at 9:22
  • 1
    Nesting reactives is a fundamental error. Reactives are functions, just like any other. R's scoping rules mean that a reactive defined inside another is not available to Shiny's "alert system" that controls reactivity. See here for more details. Commented Mar 4, 2022 at 9:35

1 Answer 1

2

Reactive objects could be assigned in an observer. Try this

Admit<-c("Admitted","Rejected","Admitted", "Rejected", "Admitted", "Rejected", "Admitted",
         "Rejected","Admitted", "Rejected", "Admitted","Rejected","Admitted", "Rejected","Admitted","Rejected", "Admitted", "Rejected",
         "Admitted","Rejected", "Admitted" ,"Rejected","Admitted", "Rejected")
Gender<-c("Male","Male","Female","Female", "Male",   "Male",   "Female", "Female", "Male","Male","Female","Female",
          "Male","Male","Female","Female","Male",   "Male",   "Female", "Female","Male","Male","Female","Female")
Dept<-c( "A","A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "F", "F", "F", "F")
Freq<-c("512", "313",  "89",  "19", "353", "207",  "17",   "8", "120", "205", "202", "391", "138", "279", "131", "244",  "53", "138",
        "94", "299",  "22", "351",  "24", "317")

d1 <- data.frame(Admit,Gender,Dept, Freq,stringsAsFactors = FALSE)
d1$Date = Sys.time() + seq_len(nrow(d1))

library(shiny)
library(DT)

ui <- fluidPage(
  titlePanel("UC Berkley Admissions"),
  
  mainPanel(
    tabsetPanel(
      id = 'dataset',
      tabPanel("Sample Bank",
               
               DT::DTOutput("banking.df_data"),
               tableOutput('table'),
               br(),
               actionButton("saveBtn","Save"),
               br(),
               actionButton(inputId = "reset", label = "Reset")
               
      ))))

server <- function(input, output) {
  dd<-reactive(d1)
  DF1 <- reactiveValues(data=NULL)
  observe({ DF1$data <- dd() })
  
  output$banking.df_data<-renderDT(
    DF1$data, editable = TRUE)
  
  observeEvent(input$banking.df_data_cell_edit, {
    DF1$data[input$banking.df_data_cell_edit$row,input$banking.df_data_cell_edit$col] <<- input$banking.df_data_cell_edit$value
  })
  
  output$table <- renderTable(DF1$data)
}

shinyApp(ui = ui, server = server)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.