реактивный ввод не работает после загрузки Javascript

Я хотел бы добавить средство просмотра белков в свое блестящее приложение. После загрузки скрипта мое приложение больше не отвечает ни на один из моих входов. Ниже представлена ​​упрощенная версия моего приложения с использованием набора данных 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)

Как заставить приложение снова реагировать на мои действия?

РЕДАКТИРОВАТЬ:

Я также попытался переместить скрипт в пользовательский интерфейс, но таблица по-прежнему не отвечает на ввод:

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)

person Nivel    schedule 10.03.2019    source источник


Ответы (2)


Попробуйте перейти к этому коду и тегам javascript конкретно в свой пользовательский интерфейс. Текущий renderUI() не использует никакого реактивного контента. Также проверьте свою консоль javascript, чтобы увидеть, не выдает ли скрипт какие-либо ошибки. Ниже добавление его в качестве библиотеки, которая загружается при создании пользовательского интерфейса, было бы лучшей формой. Если вам нужно вызвать функцию javascript в реактивном пользовательском интерфейсе, вы можете специально вызывать функции, которые загружаются в скрипт 3Dmol-min.js.

 dashboardPage(
    tags$head(tags$script(src="http://3Dmol.csb.pitt.edu/build/3Dmol-min.js")),
person Soren    schedule 10.03.2019
comment
Большое спасибо за ваш комментарий. Это работает, если я перемещаю все в пользовательский интерфейс, но проблема в том, что я загружаю локальный файл и хочу раскрасить определенные части структуры с помощью реактивных входных данных. В любом случае, вы могли бы подумать о том, чтобы сделать это реактивным? - person Nivel; 10.03.2019
comment
Рад узнать, что это сработало! Попробуйте добавить зеленую галочку. Что касается ваших более широких потребностей, я рад помочь подумать о дизайне, но это сложно без дополнительного кода или описания. Короткий ответ заключается в том, что вы можете посмотреть определения CSS и изменить определения классов объектов на основе реактивного ввода. Shinyjs имеет множество полезных функций, включая addClass: rdrr.io/cran/shinyjs/man/ classFuncs.html с определением CSS другого цвета (или того, что вам нужно), это был бы оптимальный подход по сравнению с повторным рендерингом самих объектов HTML. - person Soren; 10.03.2019
comment
Я не совсем понимаю, как я мог сделать его реактивным, когда я переношу весь код в пользовательский интерфейс. Как бы я, например, изменил цвет ('data-backgroundcolor'='0xffffff') на основе пользовательского ввода? - person Nivel; 10.03.2019
comment
Вы можете использоватьObservEvent(input$your_object_id, {addClass(id,class}) - person Soren; 11.03.2019
comment
Я переместил скрипт в пользовательский интерфейс, но ответа по-прежнему нет. - person Nivel; 11.03.2019

Существует конфликт между jquery 3Dmol и блестящим jquery.

Если вы запустите скрипт nojquery, он работает:

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

person Nivel    schedule 14.03.2019