代码之家  ›  专栏  ›  技术社区  ›  SNT

在R数据表中添加按钮或模式链接以复制书签URL

  •  0
  • SNT  · 技术社区  · 7 年前

    我有一个保存书签URL的表。现在,当您单击按钮时,将打开模式。但一旦你有了第二条记录并点击该按钮,它就不会打开模态。此外,当模态从现在开始打开时,它有一个href。我如何清理它并显示URL?

    library(shiny)
    library(RSQLite)
    library(data.table)
    library(DT)
    library(dplyr)
    library(rclipboard)
    library(shinyBS)
    
    
    
    ui <- function(request) {
      fluidPage(rclipboardSetup(),
        DT::dataTableOutput("x1"),
        column(
          12,
          column(3,tags$div(title="forecast", numericInput("budget_input", label = ("Total Forecast"), value = 2))),
          column(2, textInput(inputId = "description", label = "Bookmark description", placeholder = "Data Summary")),
          column(2, bookmarkButton(id="bookmarkBtn"))),
        column(2, actionButton("opt_run", "Run")),
        DT::dataTableOutput("urlTable", width = "100%"),
        tags$style(type='text/css', "#bookmarkBtn { width:100%; margin-top: 25px;}")
      )
    }
    
    server <- function(input, output, session) {
    
      con <- dbConnect(RSQLite::SQLite(), "bookmarks.db", overwrite = FALSE)
      myBookmarks <- reactiveValues(urlDF = NULL)
    
      observeEvent(input$bookmarkBtn, {
        session$doBookmark()
      })
    
      observeEvent(input$opt_run, {
        cat('HJE')
      })
    
      output$x1 <- DT::renderDataTable({
        input$opt_run
        isolate({
          datatable(
            df %>% mutate(Current  = as.numeric(Current)*(input$budget_input)), selection = 'none', editable = TRUE
          )
        })
      })
    
      if(dbExistsTable(con, "Bookmarks")){
        tmpUrlDF <- data.table(dbReadTable(con, "Bookmarks"))
        myBookmarks$urlDF <- tmpUrlDF[, Timestamp := as.POSIXct(Timestamp, origin="1970-01-01 00:00")]
      } else {
        myBookmarks$urlDF <- NULL
      }
    
      session$onSessionEnded(function() {
        tmpUrlDF <- isolate({myBookmarks$urlDF})
        if(!is.null(tmpUrlDF)){
          dbWriteTable(con, "Bookmarks", tmpUrlDF, overwrite = TRUE)
        }
        dbDisconnect(con)
      })
    
      setBookmarkExclude(c("bookmarkBtn", "description", "urlTable_cell_clicked", "urlTable_rows_all", "urlTable_rows_current", "urlTable_rows_selected", "urlTable_search", "urlTable_state", "urlTable_row_last_clicked"))
    
      df <- data.table(Channel = c("A", "B","C"),
                       Current = c("2000", "3000","4000"),
                       Modified = c("2500", "3500","3000"),
                       New_Membership = c("450", "650","700"))
    
    
      shinyInput <- function(FUN, len, id, ...) {
        inputs <- character(len)
        for (i in seq_len(len)) {
          inputs[i] <- as.character(FUN(paste0(id, i), ...))
        }
        inputs
      }
    
      onBookmarked(fun=function(url){
        if(!url %in% myBookmarks$urlDF$URL){
          if(is.null(myBookmarks$urlDF)){
            myBookmarks$urlDF <-
              unique(
                data.table(
                  Description = input$description,
                  URL = paste0("<a href='", url, "'>", url, "</a>"),
                  Share = shinyInput(actionButton, 10, 'button_', label = "Assessment", onclick = 'Shiny.onInputChange(\"select_button\",  this.id)' ),
                  Timestamp = Sys.time(),
                  Session = session$token,
                  User = Sys.getenv("USERNAME")
                ),
                by = "URL"
              )
          } else {
            myBookmarks$urlDF <-
              unique(rbindlist(list(
                myBookmarks$urlDF,
                data.table(
                  Description = input$description,
                  URL = paste0("<a href='", url, "'>", url, "</a>"),
                  Share = shinyInput(actionButton, 10, 'button_', label = "Assessment", onclick = 'Shiny.onInputChange(\"select_button\",  this.id)' ),
                  Timestamp = Sys.time(),
                  Session = session$token,
                  User = Sys.getenv("USERNAME")
                )
              )), by = "URL")
          }
        }
      })
      observeEvent(input$select_button, {
      showModal(urlModal(
       myBookmarks$urlDF[input$urlTable_rows_selected,URL],
        title = "You have selected a row!"
      ))
      })
    
      output$urlTable = DT::renderDataTable({
        req(myBookmarks$urlDF)
        myBookmarks$urlDF[User %in% Sys.getenv("USERNAME")] 
      }, escape=FALSE)
    
    }
    enableBookmarking(store = "url")
    shinyApp(ui, server)
    
    0 回复  |  直到 7 年前
        1
  •  2
  •   ismirsehregal    7 年前

    以下是我认为你想要的:

    library(shiny)
    library(RSQLite)
    library(data.table)
    library(DT)
    library(dplyr)
    library(shinyjs)
    
    ui <- function(request) {
      fluidPage(
        useShinyjs(),
        DT::dataTableOutput("x1"),
        column(
          12,
          column(3, tags$div(title="forecast", numericInput("budget_input", label = ("Total Forecast"), value = 2))),
          column(2, textInput(inputId = "description", label = "Bookmark description", placeholder = "Data Summary")),
          column(2, bookmarkButton(id="bookmarkBtn"))),
        column(2, actionButton("opt_run", "Run")),
        DT::dataTableOutput("urlTable", width = "100%"),
        tags$style(type='text/css', "#bookmarkBtn { width:100%; margin-top: 25px;}")
      )
    }
    
    server <- function(input, output, session) {
    
      con <- dbConnect(RSQLite::SQLite(), "bookmarks.db", overwrite = FALSE)
      myBookmarks <- reactiveValues(urlDF = NULL)
    
      observeEvent(input$bookmarkBtn, {
        session$doBookmark()
      })
    
      observeEvent(input$opt_run, {
        cat('HJE')
      })
    
      df <- data.table(Channel = c("A", "B","C"),
                       Current = c("2000", "3000","4000"),
                       Modified = c("2500", "3500","3000"),
                       New_Membership = c("450", "650","700"))
    
      output$x1 <- DT::renderDataTable({
        input$opt_run
        req(input$budget_input)
        isolate({
          datatable(
            df %>% mutate(Current  = as.numeric(Current)*(input$budget_input)), selection = 'none', editable = TRUE
          )
        })
      }, server = FALSE)
    
      if(dbExistsTable(con, "Bookmarks")){
        tmpUrlDF <- data.table(dbReadTable(con, "Bookmarks"))
        myBookmarks$urlDF <- tmpUrlDF[, Timestamp := as.POSIXct(Timestamp, origin="1970-01-01 00:00")]
      } else {
        myBookmarks$urlDF <- NULL
      }
    
      observe({
        toExclude <- c("bookmarkBtn", "description", "urlTable_cell_clicked", "urlTable_rows_all", "urlTable_rows_current", "urlTable_rows_selected", "urlTable_search", "urlTable_state", "urlTable_row_last_clicked")
    
        if(!is.null(myBookmarks$urlDF)){
          shareBtnExclude <- paste0("shareBtn", seq_len(nrow(myBookmarks$urlDF)))
          toExclude <- c(toExclude, shareBtnExclude)
        }
    
        delayExclude <- grep("delay", names(input), value = TRUE)
        if(length(delayExclude) > 0){
          toExclude <- c(toExclude, delayExclude)
        }
    
        setBookmarkExclude(toExclude)
      })
    
      session$onSessionEnded(function() {
        tmpUrlDF <- isolate({myBookmarks$urlDF})
        if(!is.null(tmpUrlDF)){
          dbWriteTable(con, "Bookmarks", tmpUrlDF, overwrite = TRUE)
        }
        dbDisconnect(con)
      })
    
      onBookmarked(fun=function(url){
        if(!url %in% myBookmarks$urlDF$Link){
          if(is.null(myBookmarks$urlDF)){
            myBookmarks$urlDF <-
              unique(
                data.table(
                  Description = input$description,
                  Link = paste0("<a href='", url, "'>", url, "</a>"),
                  Share = as.character(actionButton(inputId=paste0("shareBtn", 1), label = "Assessment", onclick = sprintf('Shiny.setInputValue("shareBtn1", "%s", {priority: "event"});', url))),
                  Timestamp = Sys.time(),
                  Session = session$token,
                  User = Sys.getenv("USERNAME")
                ),
                by = "Link"
              )
          } else {
            myBookmarks$urlDF <-
              unique(rbindlist(list(
                myBookmarks$urlDF,
                data.table(
                  Description = input$description,
                  Link = paste0("<a href='", url, "'>", url, "</a>"),
                  Share = as.character(actionButton(inputId=paste0("shareBtn", nrow(myBookmarks$urlDF)+1), label = "Assessment", onclick = sprintf('Shiny.setInputValue("%s", "%s", {priority: "event"});', paste0("shareBtn", nrow(myBookmarks$urlDF)+1), url))),
                  Timestamp = Sys.time(),
                  Session = session$token,
                  User = Sys.getenv("USERNAME")
                )
              )), by = "Link")
          }
        }
      })
    
      output$urlTable = DT::renderDataTable({
        req(myBookmarks$urlDF)
        myBookmarks$urlDF[User %in% Sys.getenv("USERNAME")] 
      }, escape=FALSE, selection = 'none')
    
      observeEvent(lapply(paste0("shareBtn", seq_len(nrow(req(myBookmarks$urlDF)))), function(x) input[[x]]), {
        req(myBookmarks$urlDF)
        delay(100, {req(input[[paste0("shareBtn", input$urlTable_cell_clicked$row)]])
          showModal(urlModal(
            input[[paste0("shareBtn", input$urlTable_cell_clicked$row)]],
            title = paste("You have selected row", input$urlTable_cell_clicked$row)
          ))}
        )
      }, ignoreInit = TRUE)
    
    }
    
    enableBookmarking(store = "url")
    shinyApp(ui, server)
    

    我把你的电话给 shinyInput ,您要求函数每行创建10个操作按钮。我还改变了 onclick 参数直接传递url。

    老实说,我不认为将这些按钮添加到每个datatable行是一个好的选择,因为您必须跟踪动态生成的输入,您希望通过 setBookmarkExclude (这似乎效果不太好)。

    编辑:将排除零件放置在单独的 observer 而不是 这个 onBookmark 功能似乎可以解决这种情况。

    然而 this 非常有助于创建由动态创建的按钮触发的观察者。

    单击链接后直接将url复制到剪贴板的解决方案会更加优雅,但应该在另一个问题中解决。