| library(shiny) | |
| library(bslib) | |
| library(dplyr) | |
| library(ggplot2) | |
| library(shinyAce) | |
| library(shinyjs) | |
| renderLogEntry <- function(entry){ | |
| paste0(entry, " - ", date()) | |
| } | |
| withConsoleRedirect <- function(containerId, expr) { | |
| txt <- capture.output(results <- expr, type = "output") | |
| if (length(txt) > 0) { | |
| appendTabsetPanel(Session, containerId, tabPanel("Console", verbatimTextOutput(paste0(txt, "\n")))) | |
| } | |
| results | |
| } | |
| ui <- shinyUI( | |
| tagList( | |
| tags$head( | |
| tags$link(rel = "stylesheet", type = "text/css", href = "styles.css"), | |
| tags$script(src = "script.js") | |
| ), | |
| fluidPage( | |
| useShinyjs(), | |
| div( | |
| id = "sidebar", | |
| sidebarPanel( | |
| h2("Opciones"), | |
| actionButton("theme_button", "Elige un tema"), | |
| selectInput('theme_code', 'Tema editor', choices = getAceThemes(), selected = 'ambiance'), | |
| downloadButton('save_code', 'Guardar codigo', icon = icon('save')), | |
| downloadButton('save_knit', 'Guardar knitr', icon = icon('save')), | |
| tags$a(href = "https://github.com/pablovanegas/runr", target = "_blank", class = "btn btn-default shiny-bound-input", "Ver Código Fuente") | |
| ) | |
| ), | |
| mainPanel( | |
| actionButton("toggleSidebar", "Opciones"), | |
| h1("Simple R"), | |
| div(class = "row", | |
| div(class = "col-md-12", | |
| h2("Tu codigo: "), | |
| verbatimTextOutput("log"), | |
| aceEditor("rmd", mode = "markdown", value = '```{r} | |
| 2*3 | |
| ```', | |
| hotkeys = list( | |
| open_chunk = 'Ctrl-Alt-I', | |
| save_code = "Ctrl-S", | |
| help_key = "F1" | |
| ), | |
| autoComplete = "live" | |
| ), | |
| actionButton("eval", "Run", icon = icon('play')), | |
| actionButton('clear', 'Clear', icon = icon('eraser')), | |
| actionButton("open_chunk", "Insert Chunk", icon = icon('plus')) | |
| ))) | |
| , | |
| div( | |
| class = "row", | |
| div( | |
| class = "col-md-12", | |
| h1("Resultado: "), | |
| htmlOutput("knitDoc") | |
| ) | |
| ) | |
| ) | |
| ) | |
| ) | |
| server <- shinyServer(function(input, output, session) { | |
| hide("sidebar") | |
| observeEvent(input$theme_button, { | |
| showModal(modalDialog(title = "Elige un tema", shinythemes::themeSelector())) | |
| }) | |
| observe({ | |
| updateAceEditor(session,"rmd", | |
| theme = input$theme_code | |
| ) | |
| }) | |
| observeEvent(input$eval, { | |
| HTML(knitr::knit2html(text = isolate(input$rmd), quiet = TRUE)) | |
| }) | |
| observeEvent(input$clear, { | |
| updateAceEditor(session, 'rmd', value = '') | |
| }) | |
| observeEvent(input$open_chunk, { | |
| delay(3000, { | |
| updateAceEditor(session, 'rmd', value = paste(isolate(input$rmd), "\n{r}\n\n\n", sep = '')) | |
| }) | |
| }) | |
| observeEvent(input$rmd_open_chunk, { | |
| delay(3000, { | |
| old_val <- isolate(input$rmd) | |
| new_chunk <- "\n{r}\n\n\n" | |
| new_val <- paste(old_val, new_chunk, sep = "") | |
| updateAceEditor(session, 'rmd', value = new_val) | |
| }) | |
| }) | |
| observeEvent(input$rmd_help_key, { | |
| showModal(modalDialog( | |
| title = "Help Menu", | |
| h2("Hot-Keys"), | |
| "Use the following hot-keys:", | |
| tags$ul( | |
| tags$li("Ctrl-Alt-I: Open Chunk"), | |
| tags$li("Ctrl-F: Find & Replace"), | |
| tags$li("F1: Help Menu"), | |
| tags$li("Ctrl-Z: Undo"), | |
| tags$li("Ctrl-Y: Redo"), | |
| ) | |
| )) | |
| }) | |
| output$save_code <- downloadHandler( | |
| filename = function() { | |
| paste("code-", Sys.Date(), ".Rmd", sep = "") | |
| }, | |
| content = function(file) { | |
| writeLines(input$rmd, file) | |
| } | |
| ) | |
| output$save_knit <- downloadHandler( | |
| filename = function() { | |
| paste("knit-", Sys.Date(), ".html", sep = "") | |
| }, | |
| content = function(file) { | |
| tmp_file <- tempfile(fileext = ".Rmd") | |
| writeLines(input$rmd, tmp_file) | |
| rmarkdown::render(input = tmp_file, output_file = file, output_format = "html_document") | |
| } | |
| ) | |
| observeEvent(input$toggleSidebar, { | |
| toggle(session, "sidebar") | |
| } | |
| ) | |
| }) | |
| shinyApp(ui, server) | |