为什么R Shiny不接受jQuery设置的文本输入?

时间:2016-03-31 19:09:02

标签: javascript jquery html r shiny

我正在尝试构建一个没有ui.R文件的R Shiny应用程序,几乎让它正常工作,但在最后的障碍中跌跌撞撞。以下是该问题的最简单的工作演示:

  1. index.html文件定义了两个按钮,一个名为'RAND',由jQuery控制,另一个名为'ADD1',由R Shiny控制。我还有两个名为'temp'和'out'的文本框。
  2. 这个虚拟程序的目标是'RAND'将随机数加载到'temp'中,然后'ADD1'将'temp'中存储的值加1。
  3. 'RAND'按钮工作正常,但'ADD1'按钮产生'NA'。有趣的是,如果我手动修改'temp'值然后再次点击'ADD1',它会产生正确的值!
  4. 我的问题是:为什么程序的行为与它一样?如何在不必手动重新键入'temp'的内容的情况下使'ADD1'工作?
  5. 这是我的index.html:

    <html>
    <head>
    <link rel="stylesheet" type="text/css" href="jquery-ui.css"/>
    <script src="jquery.js" type="text/javascript"></script>
    <script src="jquery-ui.js" type="text/javascript"></script>
    <script src="test.js" type="text/javascript"></script>
    <script src="shiny.js" type="text/javascript"></script>
    </head>
    <body>
    <div id="RAND" name="RAND">RAND</div>
    <div id="ADD1" name="ADD1" class="action-button">+1</div>
    <p></p>
    <div class="form-group shiny-input-container">
    <input id="temp" name="temp" type="text" class="form-control"/>
    </div>
    <p></p>
    <div id="out" class="shiny-text-output"></div>
    </body>
    </html>
    

    这是server.R文件:

    library(shiny)
    shinyServer(function(input,output,session){ 
        observeEvent(input$ADD1, {
            output$out <- renderText({ as.numeric(input$temp) + 1 })
        });
    });
    

    最后,这是我的Javascript代码(test.js):

    $(function(){
        $("#RAND").button()
        $("#RAND").click(function() {
            $("#temp").val(Math.random());
        });
        $("#ADD1").button()
    });
    

1 个答案:

答案 0 :(得分:2)

感谢warmoverflow的建议,我设法回答了我自己的问题:

index.html保持不变

server.R成为:

library(shiny)
shinyServer(function(input,output,session){ 
    observe({
        input$randval
    })
    observeEvent(input$ADD1, {
        output$out <- renderText({ as.numeric(input$randval) + 1 })
    })
})

和test.js成为:

$(function(){
    $("#RAND").button()
    $("#RAND").click(function() {
        val = Math.random();
        $("#temp").val(val);
        Shiny.onInputChange("randval",val);
    });
    $("#ADD1").button()
});

请注意,$(#temp)中存储的值并未真正用于任何内容,可以删除。我把它留在代码中,与我最初的问题表述进行比较。