Создание блестящего приложения с шаблоном HTML - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь создать приложение Shiny, используя шаблон HTML, как указано в документах . Я использую Bulma в качестве CSS фреймворка, и поскольку в приложении много графики, я решил использовать вкладки для их разделения.

Вывод (некоторые renderText в этом примере) отображается правильно на первой вкладке, но на второй вкладке вывод не отображается, только selectInput, и я не вижу никаких сообщений об ошибках в консоли. Ниже приведен воспроизводимый пример того, что я пытаюсь выполнить sh и некоторые изображения для иллюстрации.

Я подозреваю, что, возможно, мне не хватает дополнительного кода (JavaScript, может быть?), Чтобы сказать блестящему для отображения вывод на второй вкладке, но если это так, почему отображается selectInput, а не textOuptut? Кто-нибудь может мне помочь? Заранее спасибо.

шаблон. html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Shiny app</title>
  {{ headContent() }}
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css">
  <script src="index.js"></script>
</head>

<body>
  <section class="hero is-danger is-bold is-small">
    <div class="hero-body">
      <div class="container has-text-centered">
        <h1 class="title">
          Example Shiny app
        </h1>
      </div>
    </div>

    <div class="hero-foot">
      <nav class="tabs is-boxed is-centered">
        <div class="container">
          <ul>
            <li class="tab is-active" onclick="openTab(event,'Tab1')"><a>Tab 1</a></li>
            <li class="tab" onclick="openTab(event,'Tab2')"><a>Tab 2</a></li>
            <li class="tab" onclick="openTab(event,'Tab3')"><a>Tab 3</a></li>
          </ul>
        </div>
      </nav>
    </div>
  </section>

  <section class="section main">
    <div class="container">
      <div id="Tab1" class="content-tab">
        <p>
          tab1<br>
          Lorem Ipsum passages, and more recently with desktop publishing software like Aldus
          PageMaker including versions of Lorem Ipsum.</p>
        <div>
          {{ select }}
        </div>
        <div>
          {{ text }}
        </div>
      </div>
      <div id="Tab2" class="content-tab" style="display:none">
        <p>
          tab2<br>
          Details Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
          industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and
          scrambled it to make a type specimen book.</p>
        <div>
          {{ select2 }}
        </div>
        <div>
          {{ text2 }}
        </div>
      </div>
      <div id="Tab3" class="content-tab" style="display:none">
        <p>
          tab3 <br>
          It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, 
          and more recently with desktop publishing software like Aldus
          PageMaker including versions of Lorem Ipsum.</p>
      </div>
    </div>
  </section>
</body>

</html>

server.R

library(shiny)

function(input, output) {

  output$selected_var <- renderText({ 
    paste("You have selected", input$var)
  })

  output$selected_var2 <- renderText({ 
    paste("You have selected", input$var2)
  })

}

ui.R

htmlTemplate("template.html",
             select = selectInput("var", 
                                  label = "Choose a variable to display",
                                  choices = c("Percent White", 
                                              "Percent Black",
                                              "Percent Hispanic", 
                                              "Percent Asian"),
                                  selected = "Percent White"),

             text = textOutput("selected_var"),

             select2 = selectInput("var2", 
                                   label = "Choose a variable to display",
                                   choices = c("Choice one", 
                                               "Choice two",
                                               "Choice three", 
                                               "Choice four"),
                                   selected = "Percent White"),

             text2 = textOutput("selected_var2")
)

index. js (javascript для открытия вкладок)

function openTab(evt, tabName) {
    var i, x, tablinks;
    x = document.getElementsByClassName("content-tab");
    for (i = 0; i < x.length; i++) {
        x[i].style.display = "none";
    }
    tablinks = document.getElementsByClassName("tab");
    for (i = 0; i < x.length; i++) {
        tablinks[i].className = tablinks[i].className.replace(" is-active", "");
    }
    document.getElementById(tabName).style.display = "block";
    evt.currentTarget.className += " is-active";
  }

text text

1 Ответ

1 голос
/ 17 февраля 2020

Короче говоря, вам нужно вызвать Shiny.unbindAll() перед удалением Shiny входов / выходов со страницы и Shiny.bindAll() после добавления Shiny входов / выходов на страницу.

Обычно Shiny добавляет и удаляет входы / выводит на саму страницу и гарантирует, что эти входы / выходы правильно инициализированы и подключены к Shiny (также известному как «привязка»). Когда вы добавляете или удаляете входы / выходы за пределами Shiny, вы должны сообщить Shiny, используя Shiny.unbindAll() и Shiny.bindAll().

Например, в функции openTab в index.js:

function openTab(evt, tabName) {
    var i, x, tablinks;

    Shiny.unbindAll();

    x = document.getElementsByClassName("content-tab");
    for (i = 0; i < x.length; i++) {
        x[i].style.display = "none";
    }
    tablinks = document.getElementsByClassName("tab");
    for (i = 0; i < x.length; i++) {
        tablinks[i].className = tablinks[i].className.replace(" is-active", "");
    }
    document.getElementById(tabName).style.display = "block";
    evt.currentTarget.className += " is-active";

    Shiny.bindAll();
}

bindAll() и unbindAll() выполняют поиск по всей странице по умолчанию, но вы также можете вызвать их для определенного элемента c, такого как содержимое вкладки:

function openTab(evt, tabName) {
    var i, x, tablinks, activetab;

    x = document.getElementsByClassName("content-tab");
    for (i = 0; i < x.length; i++) {
        Shiny.unbindAll(x[i]);
        x[i].style.display = "none";
    }
    tablinks = document.getElementsByClassName("tab");
    for (i = 0; i < x.length; i++) {
        tablinks[i].className = tablinks[i].className.replace(" is-active", "");
    }
    activetab = document.getElementById(tabName)
    activetab.style.display = "block";
    evt.currentTarget.className += " is-active";
    Shiny.bindAll(activetab);
}

Для получения дополнительной информации информация, см. https://shiny.rstudio.com/articles/dynamic-ui.html#use - javascript для изменения страницы и https://community.rstudio.com/t/what-is-the-purpose-of-using-shiny-bindall/14489/2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...