1

我正在尝试实现类似进度条的东西,以便在估计某些函数的值时使用。该功能需要很长时间才能处理。有什么方法可以从 server.R 发送一些功能已完成的指标,所以我可以在 index.html 文件中隐藏进度条。我的代码如下:

<!DOCTYPE html>
<head>
<script src="shared/jquery.js" type="text/javascript"></script>
<script src="shared/shiny.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="shared/shiny.css"/>
</head>
<body onload="progressbar.style.display='none';">
<table><tbody>
     <tr>
        <td align="right" ><label>Sample Input:</label></td>
        <td><input type="text" id="ns" value="10" title="Sample Size"></td>
     </tr>
     <tr>
        <td align="right" >&nbsp;</td>
        <td><input class="button" type="submit" id="calc" name="calc" value="Calculate"  onclick="progressbar.style.display='block';"></td>
     </tr>
     <tr>
        <td align="right" >&nbsp;</td>
        <td>&nbsp;</td>
     </tr>
     <tr>
        <td align="right" ><label id="result"> Power:</label></td>
        <td ><div id="sampleSize" class="shiny-text-output" ></div></td>
     </tr>
     <tr>
        <td align="right" >&nbsp;</td>
        <td><progress id="progressbar" value="50" max="100" ></progress> </td>
     </tr>
  </tbody></table>
</body>
</html>

我的 server.R 文件如下所示:

library(shiny)
shinyServer(function(input, output) {
data <- reactive({
    ns<-as.numeric(input$ns)
})

## set variable on loading the page
firstTime <- TRUE

# Generate an output
output$sampleSize <- renderText({

 ## get the data
 data<-data()
 if (!firstTime) {

    ## execute some long function
    Sys.sleep(5)

    ## return the output value from the above function
    return(as.character(data[1]))
 }
 else{
    firstTime<<-FALSE ## supress output on loading the page
    return(NULL)
 }
})
})
4

1 回答 1

1

据我了解您的问题,您希望在 server.R 回发到您的页面之前运行进度条?

一种可能的解决方案是使用您自己的自定义绑定。您将希望在output$sampleSize()完成后隐藏进度条,因此我们将绑定一个输出绑定。Shiny文档中解释了输出绑定。

你需要给你的输出div一个新的类,而不是shiny-text-output例如:

<div id="sampleSize" class="sampler"></div>

现在绑定(将此代码添加为外部 .js 脚本或脚本标签中的页面):

var some_binding = new Shiny.OutputBinding();
$.extend(some_binding, {
  find: function(scope) {
    return $(scope).find('.sampler');
  },
  renderValue: function(el, data) {

    // Populate your div with output.
    $(el).text(data);

    // Hide your progress bar.
    $('#progressbar').hide();

  }
});

Shiny.outputBindings.register(some_binding, "someone.some_binding");

现在sampleSize被赋予一个值来显示进度条也被隐藏了。这是高度未经测试的,但一般方法应该有效。

于 2013-05-09T14:56:35.233 回答