在R中添加书签并保存书签
我正在尝试使用R Shining应用程序中的书签,并将书签保存在表格中。第一阶段,我希望在本地保存它们,并在加载此应用程序时检索它们。然后将它们保存到数据库中。下面是用于将其添加到书签并保存在表中的代码。从现在起,书签可以从保存的RDS中读取数据 shinyapps.io上也有URL书签功能,可以将书签保存到AWS上的数据库中 有光泽的图书馆 图书馆馆藏 图书馆数据表在R中添加书签并保存书签,r,shiny,R,Shiny,我正在尝试使用R Shining应用程序中的书签,并将书签保存在表格中。第一阶段,我希望在本地保存它们,并在加载此应用程序时检索它们。然后将它们保存到数据库中。下面是用于将其添加到书签并保存在表中的代码。从现在起,书签可以从保存的RDS中读取数据 shinyapps.io上也有URL书签功能,可以将书签保存到AWS上的数据库中 有光泽的图书馆 图书馆馆藏 图书馆数据表 ui这里有一种替代我之前使用saveRDS而不是sqlite的方法: 编辑:添加了用户名检查 library(shiny) #
ui这里有一种替代我之前使用saveRDS而不是sqlite的方法: 编辑:添加了用户名检查
library(shiny)
# library(RSQLite)
library(data.table)
ui <- function(request) {
fluidPage(
plotOutput("plot"),
sliderInput("n", "Number of observations", 1, nrow(faithful), 100),
fluidRow(column(2, textInput(inputId = "description", label = "Bookmark description", placeholder = "Data Summary")), column(2, bookmarkButton(id="bookmarkBtn"))),
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()
})
# 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
# }
if(file.exists("bookmarks.rds")){
myBookmarks$urlDF <- readRDS("bookmarks.rds")
} else {
myBookmarks$urlDF <- NULL
}
session$onSessionEnded(function() {
tmpUrlDF <- isolate({myBookmarks$urlDF})
if(!is.null(tmpUrlDF)){
# dbWriteTable(con, "Bookmarks", tmpUrlDF, overwrite = TRUE)
saveRDS(tmpUrlDF, "bookmarks.rds")
}
# 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"))
output$plot <- renderPlot({
hist(faithful$eruptions[seq_len(input$n)], breaks = 40)
})
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>"), 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>"), Timestamp = Sys.time(), Session = session$token, User = Sys.getenv("USERNAME")))), by="URL")
}
}
})
output$urlTable = DT::renderDataTable({
req(myBookmarks$urlDF)
myBookmarks$urlDF[User %in% Sys.getenv("USERNAME")]
}, escape=FALSE)
}
enableBookmarking(store = "url")
shinyApp(ui, server)
所以这在shinyapp.io中有效,但所有用户都可以看到每个人制作的书签。是否可以捕获并过滤用户名,以仅显示特定用户已添加书签的书签?您计划如何识别用户?您是否使用任何特殊的登录机制?我不熟悉shinyapps.io。我试图做的是将这个User=Sys.getenvLOGNAME添加到`myBookmarks$urlDF`中,然后在输出表中进行过滤,就像这样输出$urlTable=DT::renderDataTable{subsetmyBookmarks$urlDF,User==Sys.getenvLOGNAME},escape=FALSE好的,请查看我的编辑。我使用用户名窗口。但是您需要记住,Sys.getenv获取服务器端的变量,而不是客户端的变量。所以我不确定这是否真的是你想要的,明白了。因此,当我在shinyapps.io上运行这个程序时,它会返回一个闪亮的用户名。即使我与不同的用户登录。