【问题标题】:reactive input not working after loading Javascript加载Javascript后反应输入不起作用
【发布时间】:2019-08-01 02:42:00
【问题描述】:

我想在我的闪亮应用中添加一个蛋白质查看器。加载脚本后,我的应用程序不再响应我的任何输入。下面是使用 mtcars 数据集的我的应用程序的简化版本。

我的代码:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "Example"),
  dashboardSidebar(
    sidebarMenu(id = "sidebarmenu",
           selectizeInput("sample2", "Sample: ",
                               choices = c("cyl", "mpg", "disp", "hp")))),
  dashboardBody(
     fluidRow(
      box(title="3D Structure", width = 6, status="primary", solidHeader =TRUE, 
          uiOutput("structure_3d"))),
  fluidPage( 
    box(status="primary", solidHeader = FALSE, align = "center",
        DT::dataTableOutput("table")))))

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

mtcars2 <- reactive({

  mtcars2 <- mtcars

  return(mtcars2)
}) 

output$table <- DT::renderDataTable({

mtcars2 <- mtcars2()
mtcars2 <- subset(mtcars2, select = c(input$sample2))

  table <- DT::datatable(mtcars2, rownames = FALSE)

})

output$structure_3d <- renderUI({

  tabPanel("3D Structure", 
           tags$head(tags$script(src="http://3Dmol.csb.pitt.edu/build/3Dmol-min.js")),
           tags$div(
             style="height: 400px; width: 700px: position: relative;",
             class='viewer_3Dmoljs',
             'data-pdb'='2POR',
             'data-backgroundcolor'='0xffffff',
             'data-style'='cartoon'))

})

}

shinyApp(ui = ui, server = server)

如何让应用再次对我的输入做出反应?

编辑:

我也尝试将脚本移动到 UI,但表格仍然没有响应输入:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "Example"),
  dashboardSidebar(
    sidebarMenu(id = "sidebarmenu",
           selectizeInput("sample2", "Sample: ",
                               choices = c("cyl", "mpg", "disp", "hp")))),
  dashboardBody(
     fluidRow(
      box(title="3D Structure", width = 6, status="primary", solidHeader =TRUE, 
          tags$head(tags$script(src="http://3Dmol.csb.pitt.edu/build/3Dmol-min.js")),
          tags$div(
            style="height: 400px; width: 700px: position: relative;",
            class='viewer_3Dmoljs',
            'data-pdb'='2POR',
            'data-backgroundcolor'='0xffffff',
            'data-style'='cartoon'))),
      fluidRow( 
        box(status="primary", solidHeader = FALSE, align = "center",
            DT::dataTableOutput("table")))))

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

mtcars2 <- reactive({

  mtcars2 <- mtcars

  return(mtcars2)
}) 

output$table <- DT::renderDataTable({

mtcars2 <- mtcars2()
mtcars2 <- subset(mtcars2, select = c(input$sample2))

  table <- DT::datatable(mtcars2, rownames = FALSE)

})

}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny shinydashboard shinyjs shiny-reactivity


    【解决方案1】:

    尝试将此代码和 javascript 标记移至您的 UI。当前的 renderUI() 不使用任何响应式内容。还要检查你的 javascript 控制台,看看脚本是否抛出任何错误。下面,将其添加为创建 UI 时加载的库会更好。如果需要在响应式 UI 中调用 javascript 函数,可以专门调用 3Dmol-min.js 脚本中正在加载的函数。

     dashboardPage(
        tags$head(tags$script(src="http://3Dmol.csb.pitt.edu/build/3Dmol-min.js")),
    

    【讨论】:

    • 非常感谢您的评论。如果我将所有内容都移到 UI 上,它会起作用,但问题是我加载了一个本地文件,我想使用反应输入为结构的特定部分着色。无论如何,你可以考虑让这个反应?
    • 很高兴知道它有效!考虑添加一个绿色复选标记。对于您更广泛的需求,很乐意帮助您考虑设计,但如果没有更多代码或描述,就很难了。简短的回答是,您可能想查看 CSS 定义并根据响应式输入更改对象的类定义。 Shinyjs 有很多有用的功能,包括 addClass:rdrr.io/cran/shinyjs/man/classFuncs.html 具有不同颜色的 CSS 定义(或您需要的颜色),这将是重新渲染 HTML 对象本身的最佳方法。
    • 我不太明白当我将所有代码移到 UI 时如何让它反应。例如,我将如何根据用户输入更改颜色('data-backgroundcolor'='0xffffff')?
    • 你可以使用 observeEvent(input$your_object_id, { addClass(id,class })
    • 我将脚本移到 UI 上,但仍然没有响应。
    【解决方案2】:

    3Dmol jquery 和闪亮的 jquery 之间存在冲突。

    如果你运行 nojquery 脚本,它可以工作:

    tags$head(tags$script(src="http://3Dmol.csb.pitt.edu/build/3Dmol-nojquery.js"))

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 2011-02-22
      • 2016-01-24
      相关资源
      最近更新 更多