Я пытаюсь реализовать файловую систему сохранения для моего блестящего приложения.Все созданные закладки перечислены в таблице данных и могут быть загружены нажатием на название закладки.Я хочу, чтобы пользователь мог удалить файлы, нажав соответствующую ссылку actionLink.Мой код работает с уже существующими закладками, но как только я добавляю еще одну, кажется, что ни одна, кроме последней добавленной actionLink не работает.
Я изменил код от Михала Майки, который дал отличный ответ на аналогичную проблему ( Генерация наблюдателей для динамического числа входов ).Мой код идентичен по своей сути, но я не могу определить, что пошло не так.Приложение не выдает никаких ошибок при запуске.
library(shiny)
library(magrittr)
library(tibble)
ui <- function(request) {
fluidPage(
sidebarLayout(
sidebarPanel(
# example input UI
numericInput("num", "No.1", 0),
textInput("text", "Default"),
checkboxInput("check", "Choose"),
actionButton("debug", "Debug")
),
mainPanel(
wellPanel(
# saved bookmarks
DT::DTOutput("savesTbl"),
splitLayout(
textInput("sessionName", NULL, placeholder = "Insert name ..."),
bookmarkButton("Save")
),
verbatimTextOutput("status", placeholder = TRUE)
)
)
)
)
}
server <- function(input, output, session) {
observeEvent(input$debug, browser())
if (file.exists("shiny_bookmarks/saves.csv")) {
saves_tbl <- reactiveVal({ read.csv("shiny_bookmarks/saves.csv") })
} else {
saves_tbl <- reactiveVal({ as.data.frame(matrix(ncol = 4, nrow = 0, dimnames = list(NULL, c("Name", "Time", "User", "Version")))) })
}
# later to be included in a modal panel / module ----
vals <- reactiveValues(links = NULL, observer = NULL, IDs = NULL)
output$savesTbl <- DT::renderDT({
if (nrow(saves_tbl()) > 0) {
IDs <- seq_len(nrow(saves_tbl()))
# For the first time the table is created, create links & observers and save the
# sequence of integers which gives unique identifiers of created observers
if (is.null(vals$IDs)) {
vals$links <- lapply(IDs, function(x) { as.character(actionLink(paste0("deleteLink", x), label = "Delete")) })
vals$observer <- lapply(IDs, function(x) { observeEvent(input[[paste0("deleteLink", x)]], { print(x) }) })
vals$IDs <- IDs
# Whenever the table gets updated, create links & observers that are not defined yet
} else if (!all(IDs %in% vals$IDs)) {
new_ind <- !(IDs %in% vals$IDs)
vals$links <- append(vals$links,
lapply(IDs[new_ind], function(x) { as.character(actionLink(paste0("deleteLink", x), label = "Delete")) }))
vals$observer <- append(vals$observer,
lapply(IDs[new_ind], function(x) { observeEvent(input[[paste0("deleteLink", x)]], {
print(x)
# save_state_id <- sub(".*=(.*)\".*", "\\1", saves_tbl()[[x, 1]])
# save_file_path <- paste0("shiny_bookmarks/", save_state_id)
# unlink(save_file_path, recursive = TRUE)
# saves_tbl()[-x,] %>%
# saves_tbl()
}) }))
vals$IDs <- IDs
}
table <- DT::datatable(add_column(saves_tbl(), "Delete" = vals$links),
escape = FALSE,
options = list(
preDrawCallback = DT::JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
drawCallback = DT::JS('function() { Shiny.bindAll(this.api().table().node()); }')))
return(table)
} else {
return(saves_tbl())
}
})
# for debug purposes
output$status <- renderText({ paste("Saves:", nrow(saves_tbl()), "\n", "Links:", length(vals$links), "\n", "Observer:", length(vals$observer)) })
# save
setBookmarkExclude(c("bookmarkBtn", "sessionName", "savesTbl_cell_clicked", "savesTbl_rows_all", "savesTbl_rows_current",
"savesTbl_rows_selected", "savesTbl_search", "savesTbl_state", "savesTbl_row_last_clicked")
)
onBookmarked(function(url) {
add_row(saves_tbl(),
Name = as.character(a(input$sessionName, href = url)),
Time = as.character(Sys.time()),
User = Sys.getenv("USERNAME"),
Version = "0.0.0.9000") %>%
saves_tbl()
})
session$onSessionEnded(function() {
write.csv(isolate(saves_tbl()), "shiny_bookmarks/saves.csv", row.names = FALSE)
})
}
enableBookmarking("server")
shinyApp(ui, server)
Прямо сейчас я ожидаю, что каждый щелчок по «Delete» -actionLink будет печатать его идентификационный номер (например, нажатие «deleteLink1» печатает «1»),Имейте в виду, что нажатие на кнопку «Сохранить» создает папку «iny_Bookmarks »в вашем рабочем каталоге.
Буду признателен за любую помощь.Благодаря.