我想在我的闪亮模块中包含一些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");
});
答案 0 :(得分:4)
首先,检查浏览器是否可以找到您的shinyjavascript.js
。运行您的添加并在浏览器中将其打开。与RStudio的内置应用查看器(运行应用程序时弹出的查看器)相比,Chrome具有更好的检查器模块。在浏览器的检查器中,在“元素”窗格中找到对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<-renderPrint
是一个反应式,仅当{em {1}}绑定到输出控件时,才会执行 。这可能是您的情况,或者是prb
不起作用。因此,我们将两者分开。
尝试更新以下内容:
input$one
这应该在“ R ”控制台上打印“ noone”。
如果可行,将新的server <- function(input, output) {
callModule(examplemod, "example")
observe({cat(input$one, '\n')})
}
行移至您的模块:
observe
看看那里是否有回应。
使用解决方案更新2:
因此,我详细介绍了如何调试这些问题。但是已经找到了解决方案。它需要进行3个小更改:
examplemod<- function(input, output, session) {
output$prb<-renderPrint({
input$one
})
observe({cat(input$one, '\n')})
}
但是对于您为何不能直接使用 examplemod<- function(input, output, session, one) { # 1
output$prb<-renderPrint({
one() # 2
})
callModule(examplemod, "example", reactive(input$one)) # 3
的原因,我无法提供任何解释...