如何在一个shiny模块中使用shinjs::extendShinyjs()?

huangapple go评论107阅读模式
英文:

How do I use shinjs::extendShinyjs() in a shiny module?

问题

shinyjs::extendShinyjs() 在没有至少一些命名空间的情况下似乎无法在 Shiny 模块中正常工作。

以下是一个使用简单的JS扩展来增加输入值的示例(按预期工作):

  1. library(shiny)
  2. ui <- tagList(
  3. fluidPage(
  4. shinyjs::useShinyjs(),
  5. shinyjs::extendShinyjs(text = "shinyjs.increase_click_count = function(val){
  6. Shiny.setInputValue('count', +val + 1, { priority: 'event' })
  7. }", functions = "increase_click_count"
  8. ),
  9. actionButton("increase","Increase"),
  10. numericInput("count", "Count", 0),
  11. textOutput("clicks")
  12. )
  13. )
  14. server <- function(input, output, session) {
  15. observeEvent(input$increase, {
  16. shinyjs::js$increase_click_count(input$count)
  17. })
  18. output$clicks = renderText(input$count)
  19. }
  20. shinyApp(ui, server)

然而,当我将此逻辑包装在模块中时,shinyjs.increase_click_count() 函数不再更新值:

  1. library(shiny)
  2. module_ui <- function(id) {
  3. tagList(
  4. shinyjs::useShinyjs(),
  5. shinyjs::extendShinyjs(text = paste0("shinyjs.increase_click_count = function(val){
  6. Shiny.setInputValue('", NS(id, "count"), "', +val + 1, { priority: 'event' })
  7. }"), functions = "increase_click_count"
  8. ),
  9. actionButton("increase","Increase"),
  10. numericInput(NS(id, "count"), "Count", 0),
  11. textOutput(NS(id,"clicks"))
  12. )
  13. }
  14. module_server <- function(id) {
  15. moduleServer(id, function(input, output, session) {
  16. observeEvent(input$increase, {
  17. shinyjs::js$increase_click_count(input$count)
  18. })
  19. output$clicks = renderText(input$count)
  20. })
  21. }
  22. ui <- fluidPage(
  23. module_ui("mod")
  24. )
  25. server <- function(input, output, session) {
  26. module_server("mod")
  27. }
  28. shinyApp(ui, server)

如何正确处理Shiny模块中的JavaScript命名空间?

英文:

shinyjs::extendShinyjs() does not seem to work in a Shiny module without at least some namespacing.

Here is an example of using a simple JS extension to increase an input value (which works as intended):

  1. library(shiny)
  2. ui &lt;- tagList(
  3. fluidPage(
  4. shinyjs::useShinyjs(),
  5. shinyjs::extendShinyjs(text = &quot;shinyjs.increase_click_count = function(val){
  6. Shiny.setInputValue(&#39;count&#39;, +val + 1, { priority: &#39;event&#39; })
  7. }&quot;, functions = &quot;increase_click_count&quot;
  8. ),
  9. actionButton(&quot;increase&quot;,&quot;Increase&quot;),
  10. numericInput(&quot;count&quot;, &quot;Count&quot;, 0),
  11. textOutput(&quot;clicks&quot;)
  12. )
  13. )
  14. server &lt;- function(input, output, session) {
  15. observeEvent(input$increase, {
  16. shinyjs::js$increase_click_count(input$count)
  17. })
  18. output$clicks = renderText(input$count)
  19. }
  20. shinyApp(ui, server)

However, when I wrap this logic in a module, the shinyjs.increase_click_count() function no longer updates the value:

  1. library(shiny)
  2. module_ui &lt;- function(id) {
  3. tagList(
  4. shinyjs::useShinyjs(),
  5. shinyjs::extendShinyjs(text = paste0(&quot;shinyjs.increase_click_count = function(val){
  6. Shiny.setInputValue(&#39;&quot;, NS(id, &quot;count&quot;), &quot;&#39;, +val + 1, { priority: &#39;event&#39; })
  7. }&quot;), functions = &quot;increase_click_count&quot;
  8. ),
  9. actionButton(&quot;increase&quot;,&quot;Increase&quot;),
  10. numericInput(NS(id, &quot;count&quot;), &quot;Count&quot;, 0),
  11. textOutput(NS(id,&quot;clicks&quot;))
  12. )
  13. }
  14. module_server &lt;- function(id) {
  15. moduleServer(id, function(input, output, session) {
  16. observeEvent(input$increase, {
  17. shinyjs::js$increase_click_count(input$count)
  18. })
  19. output$clicks = renderText(input$count)
  20. })
  21. }
  22. ui &lt;- fluidPage(
  23. module_ui(&quot;mod&quot;)
  24. )
  25. server &lt;- function(input, output, session) {
  26. module_server(&quot;mod&quot;)
  27. }
  28. shinyApp(ui, server)

How do I properly deal with Shiny module namespaces in Javascript?

答案1

得分: 1

你缺少了一个NS调用

  1. library(shiny)
  2. module_ui <- function(id) {
  3. tagList(
  4. shinyjs::useShinyjs(),
  5. shinyjs::extendShinyjs(text = paste0("shinyjs.increase_click_count = function(val){
  6. Shiny.setInputValue('', NS(id, 'count'), '', +val + 1, { priority: 'event' })
  7. }"), functions = "increase_click_count"
  8. ),
  9. actionButton(NS(id, "increase"), "Increase"),
  10. numericInput(NS(id, "count"), "Count", 0),
  11. textOutput(NS(id,"clicks"))
  12. )
  13. }
  14. module_server <- function(id) {
  15. moduleServer(id, function(input, output, session) {
  16. observeEvent(input$increase, {
  17. shinyjs::js$increase_click_count(input$count)
  18. })
  19. output$clicks = renderText(input$count)
  20. })
  21. }
  22. ui <- fluidPage(
  23. module_ui("mod")
  24. )
  25. server <- function(input, output, session) {
  26. module_server("mod")
  27. }
  28. shinyApp(ui, server)
英文:

You're missing a a NS call

  1. library(shiny)
  2. module_ui &lt;- function(id) {
  3. tagList(
  4. shinyjs::useShinyjs(),
  5. shinyjs::extendShinyjs(text = paste0(&quot;shinyjs.increase_click_count = function(val){
  6. Shiny.setInputValue(&#39;&quot;, NS(id, &quot;count&quot;), &quot;&#39;, +val + 1, { priority: &#39;event&#39; })
  7. }&quot;), functions = &quot;increase_click_count&quot;
  8. ),
  9. actionButton(NS(id, &quot;increase&quot;), &quot;Increase&quot;),
  10. numericInput(NS(id, &quot;count&quot;), &quot;Count&quot;, 0),
  11. textOutput(NS(id,&quot;clicks&quot;))
  12. )
  13. }
  14. module_server &lt;- function(id) {
  15. moduleServer(id, function(input, output, session) {
  16. observeEvent(input$increase, {
  17. shinyjs::js$increase_click_count(input$count)
  18. })
  19. output$clicks = renderText(input$count)
  20. })
  21. }
  22. ui &lt;- fluidPage(
  23. module_ui(&quot;mod&quot;)
  24. )
  25. server &lt;- function(input, output, session) {
  26. module_server(&quot;mod&quot;)
  27. }
  28. shinyApp(ui, server)

huangapple
  • 本文由 发表于 2023年7月28日 05:08:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76783420.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定