视频随机时,shinyjs 中的隐藏/显示不起作用

问题描述 投票:0回答:1

我想制作一个闪亮的应用程序,它随机选择两个视频之一,并且仅在视频播放后,才会生成一个单选按钮,询问人们是否观看了该视频。

此代码适用于一个视频,如下所示:

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  uiOutput("video"),
  hidden(
    radioButtons(
      "instructions",
      "Have you finished watching the instructions?",
      choices = list(
        "Yes" = 'finished_instructions'
      ),
      width = '100%',
      selected = character(0)
    )
  )
)
server <- function(input, output) {
  
  output$video <- renderUI({
    HTML(
      '<html>
        <body>
          <iframe id="my-iframe"
              width="560" height="315"
              src="https://www.youtube.com/embed/-CrOeCzMFSQ?si=3pKfFn_AnvVXKASX?&enablejsapi=1" 
              frameborder="0"
              allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen
          ></iframe>
          
          <script type="text/javascript">
            var tag = document.createElement("script");
            tag.src = "https://www.youtube.com/iframe_api";
            var firstScriptTag = document.getElementsByTagName("script")[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            var player;
            function onYouTubeIframeAPIReady() {
              player = new YT.Player("my-iframe");
              
              player.addEventListener("onStateChange", function(state){
                if (state.data === 0) {
                  document.getElementById("instructions").classList.remove("shinyjs-hide");
                }
              });
            }  
          </script>
        </body>
      </html>'
    )
  })
}

shinyApp(ui, server)

但是,无论我如何编码,当我尝试用多个视频实现这一点时,单选按钮根本不会出现。损坏的代码如下所示 - 视频将填充,但与上面的示例不同,单选按钮永远不会出现。关于如何解决这个问题有什么想法吗?

library(shiny)
library(shinyjs)

ui <- fluidPage(
  
  
  useShinyjs(),
  uiOutput("video"),
  hidden(
    radioButtons(
      "instructions",
      "Have you finished watching the instructions?",
      choices = list(
        "Yes" = 'finished_instructions'
      ),
      width = '100%',
      selected = character(0)
    )
  )
)
server <- function(input, output) {

vec2 <- c(1,2)
arm_condition <- sample(vec2,1)

if (arm_condition == 1){
  output$video <- renderUI({
    HTML(
      '<html>
        <body>
          <iframe id="my-iframe"
              width="560" height="315"
              src="https://www.youtube.com/embed/-CrOeCzMFSQ?si=3pKfFn_AnvVXKASX?" 
              frameborder="0"
              allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen
          ></iframe>
          
          <script type="text/javascript">
            var tag = document.createElement("script");
            tag.src = "https://www.youtube.com/iframe_api";
            var firstScriptTag = document.getElementsByTagName("script")[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            var player;
            function onYouTubeIframeAPIReady() {
              player = new YT.Player("my-iframe");
              
              player.addEventListener("onStateChange", function(state){
                if (state.data === 0) {
                  document.getElementById("instructions").classList.remove("shinyjs-hide");
                }
              });
            }  
          </script>
        </body>
      </html>'
    )
  })}
  
if (arm_condition == 2){
  output$video <- renderUI({
    HTML(
      '<html>
        <body>
          <iframe id="my-iframe"
              width="560" height="315"
              src="https://www.youtube.com/embed/HlYFfFUdPcw?si=v3V_FzhmndmYXJSS" 
              frameborder="0"
              allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen
          ></iframe>
          
          <script type="text/javascript">
            var tag = document.createElement("script");
            tag.src = "https://www.youtube.com/iframe_api";
            var firstScriptTag = document.getElementsByTagName("script")[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            var player;
            function onYouTubeIframeAPIReady() {
              player = new YT.Player("my-iframe");
              
              player.addEventListener("onStateChange", function(state){
                if (state.data === 0) {
                  document.getElementById("instructions").classList.remove("shinyjs-hide");
                }
              });
            }  
          </script>
        </body>
      </html>'
    )
  })
}}

shinyApp(ui, server)

我已经尝试了分配随机运算符、随机选择两个 src 之一的各种版本,但是当有两个以上的视频时,没有任何方法可以让单选按钮出现。我还尝试专门创建“video1”和“instructions1”以及“video2”和“instructions2”,但这也不起作用。

r shiny shinyjs
1个回答
0
投票

您必须启用

JS
API。这可以通过添加来完成

?&enablejsapi=1

在视频链接的末尾(请参阅第一个示例)。如果您将其添加到每个链接的扩展示例中,它将起作用。

© www.soinside.com 2019 - 2024. All rights reserved.