0

I have a Shiny app that shows the database as a DT table. In this table there is a column called Project.File.Location that contains a project's path.

I want the app to have the ability to make these paths clickable, so that when the user clicks on a path the app will open that folder.

How can I do this?

  • Please note that this app will not be deployed on the RShiny server rather I will be using the RInno package to create a standalone desktop app.

  • Based on Iz100's comments, maybe flexdashboard could be another option as it's an .Rmd file so I think doesn't deploy the app.

Sample Data:

structure(list(Reference.Number = c("33333", "44444", "22222", 
"55555", "66666"), Request.Date = c("1/6/2022", "1/6/2022", "1/19/2022", 
"1/20/2021", "1/24/2022"), Requestor.Name = c("Comm Dist 3 by Kitty", 
"Comm Dist 3 by Kitty", "Updated maps for David", 
"    Stone Cold", "Updated SOE 60 inch wall map"), Requestor.Dept.Div = c("C 3 Staff", 
"C 3 Staff", "Unincorp & Comm", "Mt.Rushmore AME Church Ft. Billy", 
"SOE"), Requestor.Phone = c("", "", "", "", ""), Contact.Person = c("Tommy", 
"Tommy", "Bob", "Bob", "Joe"), Contact.Phone = c("1111", 
"2222", "3333", "ext 1111", "3434"), Deadline = c("1/20/2022", 
"1/20/2022", "1/22/2022", "", "1/24/2022"), Project.Description = c("45x36 portrait map ", 
"45x36 portrait map  ", 
"24x24 Unincorporated areas, "Percent Females Aged 25 - 55  Below Poverty Level By Zip Code", 
"SOE Wall Map 60x60 p), Project.File.Location = c("", 
"", "C:\\ABC\\Tommy\\work|Map-Projects\\BD Unincororated\\#14785 Unincorporated 24x24.pdf", 
"C:\\ABC\\Demographics\\Demographic_Request\\FemalesAge10-18BelowPoveryLevel\\FemalesAge10-18BelowPoveryLevel.aprx", 
"C:\\ABC\\Tommy\\work|Map-Projects\\BD Unincororated\\#14786 V P 60x60.pdf"
), PDF.File.....Map.Name.... = c("", "", "", "C:\\ABC\\Demographics\\Demographic_Request\\FemalesAge10-18BelowPoveryLevel\\pdfs\\MapNo14785.pdf", 
""), Assigned.To = c("", "", "", "", ""), Completion.Date = c("", 
"", "", "", ""), Notes = c(NA, NA, NA, NA, NA), Year = c(2022, 
2022, 2022, 2022, 2022)), class = "data.frame", row.names = c(NA, -5L))

Code:

library(shiny)
library(shinythemes)
library(shinyWidgets)
library(shinyanimate)
library(DT)
library(tidyverse)

    # Define UI for application that draws a histogram
    ui =   navbarPage(
                      tags$style("table, .table {color: unset;} .dataTable th, .datatables input {color: white}"),
                      title = div("GIS Team Projects"),
                      theme = shinytheme("cyborg"),
                      tabPanel("GIS Projects",
                               icon = icon("info"),
                               div(p(h1("Instructions:"),style="text-align: justify;")),
                               p("1. The user can add their project details.", style="color:black"),
                               uiOutput("all"),
                      sidebarLayout(
                        sidebarPanel(
                          actionButton("addData", "Add Project Details"),
                          ),
                        mainPanel(
                          downloadButton("download1","Download data as csv"),                
                          DTOutput("contents")),)
                        )
    )
    
    # Define server logic required to draw a histogram
    server <- function(input, output) {
    
      myData = df
      
      # Create an 'empty' tibble 
       user_table =
         myData %>% 
          slice(1) %>% 
        # Transpose the first row of test into two columns
        gather(key = "column_name", value = "value") %>%
        # Replace all values with ""
        mutate(value = "") %>%
        # Reshape the data from long to wide
        spread(column_name, value) %>%
        # Rearrange the column order to match that of test
        select(colnames(myData))
       
       # Display data as is
       output$contents =
         renderDT(myData,
                  server = FALSE,
                  editable = TRUE,
                  options = list(lengthChange = TRUE),
                  rownames = FALSE)
       
       # Store a proxy of contents 
       proxy = dataTableProxy(outputId = "contents")
       
       # Each time addData is pressed, add user_table to proxy
       observeEvent(eventExpr = input$addData, {
         proxy %>% 
           addRow(user_table)
       })
      
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
Ed_Gravy
  • 1,841
  • 2
  • 11
  • 34
  • 2
    You are doing some cross-origin referencing.This is not allowed default by 99% browsers. Here are some possible ways: https://stackoverflow.com/questions/10752055/cross-origin-requests-are-only-supported-for-http-error-when-loading-a-local. Even if you can, you shouldn't do so. This is a huge security risk. – lz100 Jul 01 '22 at 20:42
  • @Iz100 I thought that was the whole point of the `RInno` package as it keeps the app on `LAN`. – Ed_Gravy Jul 01 '22 at 20:57
  • 1
    Not familiar with `RInno`, but I don't think a package can help you violate browser security policies. If it does, then it should be considered a virus -_- – lz100 Jul 01 '22 at 21:08
  • Maybe `flexdashboard` could be another option as it's an `.Rmd` file so it doesn't deploy the app. – Ed_Gravy Jul 01 '22 at 22:17
  • Or what about [this](https://stackoverflow.com/questions/25858196/r-shiny-webserver-on-a-local-server) option when app is to be run locally? – Ed_Gravy Jul 01 '22 at 22:53

0 Answers0