【问题标题】:How to use shiny javascript functions with modules?如何在模块中使用闪亮的 javascript 函数?
【发布时间】:2019-01-07 19:27:50
【问题描述】:

我想在我的闪亮模块中包含一些 javascript,但无论我尝试了什么,javascript 都不会出现在最终应用程序中。我做错了什么?

App.r:

    library(shiny)
    source("examplemod.R")
    ui <- fluidPage(
      tags$head(
        tags$script(src="shinyjavascript.js")
      ),
      sidebarLayout(
        sidebarPanel(
          examplemodUI("example")
        ),
        mainPanel(

        )
      )
    )

    server <- function(input, output) {
      callModule(examplemod, "example")


    }

    shinyApp(ui, server)

模块:

   examplemodUI<-function(id){
      ns <- NS(id)

      tagList(

        textOutput(ns("prb"))

      ) 
    }

    examplemod<- function(input, output, session) {

      output$prb<-renderPrint({

        input$one

        })
    }

shinyjavascript.js

    $( document ).on("shiny:sessioninitialized", function(event) {
         Shiny.onInputChange("one", "noone");           
       });

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    首先,检查您的shinyjavascript.js 是否可以被浏览器找到。运行您的添加并在浏览器中打开它。 Chrome 的检查器模块比 RStudio 的内置应用程序查看器(运行应用程序时弹出的查看器)更好。在浏览器的 Inspector 中,在“元素”窗格中找到对 shinyjavascript.js 的引用,并且可以在“源”窗格中加载内容。

    如果该文件存在但无法加载,请确保该文件位于您应用的 R 源文件所在的子目录 www 中。

    如果找到并加载了文件,请将其更新为以下内容以进行一些老式的调试:

    console.log('JavaScript file loaded')
    $( document ).on("shiny:sessioninitialized", function(event) {
         console.log('session initialized')
         Shiny.onInputChange("one", "noone");           
       });
    

    重新加载页面并在控制台中查找这两行。这将提示我们您的代码运行了多远。

    更新:

    一旦您的 javascript 已加载并运行,我们将继续下一步。您的应用是否收到了价值?为什么不更新?

    output$prb&lt;-renderPrint 是一个反应式,仅当 当且仅当 Shiny as prb 绑定到输出控件时才执行。这可能是您的情况,或者是 input$one 不起作用。因此,我们将两者分开。

    尝试更新以下内容:

    server <- function(input, output) {
      callModule(examplemod, "example")
    
      observe({cat(input$one, '\n')})
    }
    

    这应该将“noone”打印到 R 控制台。

    如果可行,请将新的 observe 行移至您的模块:

    examplemod<- function(input, output, session) {
      output$prb<-renderPrint({
        input$one
        })
      observe({cat(input$one, '\n')})
    }
    

    看看你是否在那里得到回应。

    使用解决方案更新 2:

    所以,我已经详细说明了如何调试这些问题。但是已经找到了解决办法。它需要 3 个小改动:

     examplemod<- function(input, output, session, one) {   # 1
    
      output$prb<-renderPrint({
        one()                                               # 2
        })
    
     callModule(examplemod, "example", reactive(input$one)) # 3
    

    但我无法解释为什么你不能直接使用input...

    【讨论】:

    • 我试过了,“Javascript 文件加载”和“会话初始化”文本都打印在 console.log 上
    • 所以,JavaScript 正在运行。下一步请参阅我的更新。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 2020-01-18
    • 2021-01-10
    • 2021-10-12
    • 2019-10-20
    • 2019-01-18
    • 2022-01-26
    • 2021-11-12
    相关资源
    最近更新 更多