需要一个TextArea内显示从服务器生成到UI动态文本(语法高亮)(Need to display

2019-11-04 13:53发布

我想一个随机生成的字符串推到UI上一个文本。 新来的HTML /闪亮/ JS,但我知道的一些基本知识。

我的最终目标是使用CodeMirror( 全下载 )或ShinyAce编辑类语法高亮添加到textarea的,但我无法输出字符串从服务器到textarea的。 我想推某些R守则textStringToDisplay ,需要语法高亮。

请把以下文件中app.R的WWW文件夹:

  1. codemirror.css
  2. cobalt.css
  3. codemirror.js(我找不到GitHub上的这个文件,请使用下载链接上方,提取和看在lib文件夹中)
  4. r.js

请让我还是知道,如果你需要更多的信息,如果我要改写这个任何部件。 提前致谢。

library(shiny)

if (interactive()) {

  ui <- shinyUI(
    fluidPage(
      tags$head(tags$title("Title"),
                tags$link(rel = "stylesheet", href = "codemirror.css"),
                tags$link(rel = "stylesheet", href = "cobalt.css"),
                tags$script(src = "codemirror.js"),
                tags$script(src = "r.js")
      ),
      tags$textarea(id="textBox", name = "Feedback", textOutput(outputId = "textStringToDisplay")),
      tags$script(
        'var editorR = CodeMirror.fromTextArea(textBox, {
        mode: "r",
        lineNumbers: true,
        smartindent: true
});
        editorR.setOption("theme", "cobalt");
        editorR.setSize("50%","100%");')))

  server <- function(input, output){
    output$textStringToDisplay <- renderText(paste0(sample(letters,15),collapse = ""))
  }

  shinyApp(ui = ui, server = server)
}

Answer 1:

你好,因为我做的不是哪里出了问题我已经注释掉你的CSS和Java脚本。 你的问题是一样的在这一问题

如何创建在R闪亮的应用程序变量超链接

这里是你的代码的工作版本

library(shiny)

if (interactive()) {

  ui <- shinyUI(
    fluidPage(
      tags$head(tags$title("Title")
                # tags$link(rel = "stylesheet", href = "codemirror.css"),
                # tags$link(rel = "stylesheet", href = "cobalt.css"),
                # tags$script(src = "codemirror.js"),
                # tags$script(src = "r.js")
      ),
      uiOutput(outputId = "textStringToDisplay")
#       tags$script(
#         'var editorR = CodeMirror.fromTextArea(textBox, {
#         mode: "r",
#         lineNumbers: true,
#         smartindent: true
# });
#         editorR.setOption("theme", "cobalt");
#         editorR.setSize("50%","100%");')
))

  server <- function(input, output){
    output$textStringToDisplay <- renderUI(
      tags$textarea(id="textBox", name = "Feedback", paste0(sample(letters,15),collapse = "")))
  }

  shinyApp(ui = ui, server = server)
}


Answer 2:

这是我的最终实现。 衷心感谢@Bertil他就建议renderUI 。 只好用shinyjs包和runjs函数来获取JS脚本运行。 此外,它只有在与事件配对(如单击一个按钮)的作品。 不知道如何触发它,当应用程序加载(稍后会发布有关此有时另一个问题)。

library(shiny) 
library(shinyjs)

if (interactive()) {
     ui <- shinyUI(
    fluidPage(
      useShinyjs(),
      tags$head(tags$title("Title"),
                tags$link(rel = "stylesheet", href = "codemirror.css"),
                tags$link(rel = "stylesheet", href = "cobalt.css"),
                tags$script(src = "codemirror.js"),
                tags$script(src = "r.js")
      ),
      actionButton("btn1","Click to see code"),
      uiOutput(outputId = "textStringToDisplay")))
     server <- function(input, output){
    output$textStringToDisplay <- renderUI(
      tags$textarea(id="textBox", name = "Feedback", paste0(sample(letters,15),collapse = "")))

    ButtonPressCounter <- 0

    observeEvent(input$btn1,
                 {
                   ButtonPressCounter <<- ButtonPressCounter + 1 # Need it to happen only once
                   if(ButtonPressCounter <= 1){
                     shinyjs::runjs(
                       'var editorR = CodeMirror.fromTextArea(textBox, {
                       mode: "r",
                       lineNumbers: true,
                       smartindent: true});
                       editorR.setOption("theme", "cobalt");
                       editorR.setSize("100%","100%");')
                   }
                 })
       }
     shinyApp(ui = ui, server = server) }


文章来源: Need to display dynamic text generated from server onto UI within a TextArea(with syntax highlighting)