4

我正在使用R3.0.1 和Shiny0.7.0 创建一个带有HTML UI.

似乎我偶然发现了 Shiny 中关于元素OnLoad()事件的限制或错误。body

由于 Shiny 没有为多个 HTML 页面做好准备,正如 Joe Cheng 所说,试图在必要时使用它jQuery来显示和隐藏。divs

这工作得相当好,除非我在 OnLoad事件中隐藏 div。在那种情况下,它似乎reactive input components不再被Shiny.

下面你可以看到一个测试用例:

服务器.R

library(shiny)

shinyServer(function(input, output) {

    output$caption <- renderText({input$myInput})

})

索引.html

<head>
    <script src="shared/jquery.js" type="text/javascript"></script> 
    <script src="shared/shiny.js" type="text/javascript"></script>
    <script type="text/javascript" src="js/library.js"></script>    
</head>

 <body onload="initForm();"> 


    <div id="dMenu">

        <a href="#" onclick="showFoo();">Show foo div</a>
        <br>
        <a href="#" onclick="showBar();">Show bar div</a>
    </div>

    <!-- some random div -->
    <div id="foodiv">This is the Foo div</div>

    <!-- div with reactive input -->                
    <div id="bardiv">
        This is the Bar div
        <br>
        <input type="text" id="myInput" class ="shiny-bound-input" name="myInput" autocomplete="off"> 
        <div id="caption" class="shiny-text-output shiny-bound-output"></div>
    </div>

</body>

库.js

function showFoo(){
    $('#foodiv').show();    
    $('#bardiv').hide(); 
}


function showBar(){
    $('#foodiv').hide();
    $('#bardiv').show();    
}


function initForm(){
    /*showFoo();    */
}

如果您按原样使用此代码,Shiny 将对myInput组件中的更改做出反应并将它们写入caption组件。另一方面,如果您将其中的代码注释掉,initForm()它将停止对您写入的任何内容做出反应myInput

我用 Firefox 23.0.1 对此进行了测试。

有人知道我做错了什么吗?

4

1 回答 1

6

请参阅 Winston 的这个闪亮的邮件列表帖子。

你可以写

shinyServer(function(input, output) {
  output$caption <- renderText({input$myInput})
  outputOptions(output, 'caption', suspendWhenHidden=FALSE)
})

以确保元素在隐藏时仍然更新。

于 2013-10-04T08:50:08.273 回答