我正在尝试实现类似于进度条的功能,同时估计某个函数的值。该功能需要很长时间才能处理。有没有办法从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" > </td>
<td><input class="button" type="submit" id="calc" name="calc" value="Calculate" onclick="progressbar.style.display='block';"></td>
</tr>
<tr>
<td align="right" > </td>
<td> </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" > </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)
}
})
})
答案 0 :(得分:1)
据我了解你的问题,你想让一个进度条运行,直到server.R回复你的页面?
一种可能的解决方案是使用您自己的custom bindings。您需要在output$sampleSize()
完成时隐藏进度条,因此我们将绑定输出绑定。输出绑定在Shiny documentation中解释。
您需要为您的输出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
被赋予一个值以显示进度条时,也会被隐藏。这是非常未经测试的,但一般方法应该有效。