Hey there, the key is making sure that the reactive you are passing to the module is actually a reactive, not the data frame itself. See the data parameter inside the callModule function. Then, within the module, access that data frame object with the same syntax you would a reactive, i.e. data() and not data. Therefore, making those two small modifications, this app seems to work for me.
library(shiny)
library(DT)
#>
#> Attaching package: 'DT'
#> The following objects are masked from 'package:shiny':
#>
#> dataTableOutput, renderDataTable
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
editTableUI <- function(id, width = NULL) {
ns <- NS(id)
tagList(fluidRow(DT::dataTableOutput(ns('data_table'), width = width)))
}
editTableServer <-
function(input, output, session, data) {
output$data_table = DT::renderDataTable(
data(),
selection = 'none',
editable = TRUE,
options = list(dom = 't', pageLength = nrow(data())))
proxy = DT::dataTableProxy('data_table')
observeEvent(input$data_table_cell_edit, {
info = input$data_table_cell_edit
str(info)
i = info$row
j = info$col
v = info$value
data()[i, j] <<- coerceValue(v, data()[i, j])
replaceData(proxy, data(), resetPaging = FALSE)})
return({reactive(data())})
}
# ------------------------------------------------------------------------
ui <- fluidPage(
uiOutput("id"),
conditionalPanel(condition = "input.id",
actionButton(inputId = "go_id", label = "Load ID Data")),
editTableUI("table"),
downloadButton('download_CSV', 'Download CSV'))
server <- function(input, output, session) {
# Load data ---------------------------------------------------------------
df <- reactive({iris %>% mutate(id = rownames(iris))})
# create list of IDs
output$id <- renderUI({
id_list <- df() %>% pull(id)
selectInput("id", "Select an ID", choices = id_list, multiple = F)})
# filter total data to data for selected ID
id_df <- eventReactive(input$go_id, {df() %>% filter(id == input$id)})
# select variables and gather
display_df <- eventReactive(input$go_id,{
id_df() %>%
select(-Species) %>%
tidyr::gather(key = "Variable Label", value = "Original") %>%
dplyr::mutate(Update = as.numeric(Original))})
editdata <- callModule(editTableServer, "table", data = display_df)
output$download_CSV <- downloadHandler(
filename = function() {paste("dataset-", Sys.Date(), ".csv", sep = "")},
content = function(file) {write.csv(editdata(), file, row.names = F)})
}
shinyApp(ui, server)
Shiny applications not supported in static R Markdown documents
Created on 2020-10-06 by the reprex package (v0.3.0)