Reading javascript variable into shiny/R on app load

前端 未结 2 1120
刺人心
刺人心 2020-12-09 23:53

What I want to do is get the user ID from a wordpress logged-in user when I load a shiny app in an iframe. This variable could then be used to save and modify user-specific

相关标签:
2条回答
  • 2020-12-10 00:20

    Erik Westlund was kind enough to provide the following solution.


    get_user_id.js:

    document.domain = "MYDOMAIN.com"; 
    
    var userIDVariableName = parent.userID; 
    var userID = document.getElementById("userID"); 
    userID.value = userIDVariableName; 
    
    var usernameVariableName = parent.username; 
    var username = document.getElementById("username"); 
    username.value = usernameVariableName;
    

    As mentioned above remember to change the domain. And set it in the page loading the iframe.


    ui.R:

    library(shiny) 
    
    shinyUI( bootstrapPage( 
    
    # Hidden input boxes to save the variable to 
    HTML(‘ <input type="text" id="userID" name="userID" style="display: none;"> ‘), 
    HTML(‘ <input type="text" id="username" name="username" style="display: none;"> ‘), 
    
    
    # include the js code 
    includeScript("get_user_id.js"), 
    
    # Show the output 
    textOutput("view") 
    ))
    

    Change the path to the script as needed.


    server.R:

    shinyServer(function(input, output, session) { 
    
    
    
    userID <- reactive({ input$userID }) 
    username <- reactive({ input$username }) 
    
    output$view <- renderText( paste0( "User ID is: ",userID()," and username is: ",username() ) ) 
    
    })
    


    Add this to the page containing the iframe:

    PHP to get the variable from wordpress.

    <?php global $current_user; 
    get_currentuserinfo(); 
    $user_name = $current_user->user_login; 
    $user_ID = get_current_user_id(); 
    ?>
    

    And then this to make it a java variable:

    <script type="text/javascript"> 
    var username = <?php echo json_encode($user_name) ?> ; 
    var userID = <?php echo json_encode($user_ID) ?> ; 
    </script>
    

    Set domain and the iframe:

    <script type="text/javascript"> 
    document.domain = "MYDOMAIN.com"; 
    </script> 
    <iframe id="example1" style="border: none; width: 100%; height: 500px;" src="PATH_TO_SHINY_APP" width="300" height="150" frameborder="0"></iframe>
    
    0 讨论(0)
  • 2020-12-10 00:21

    If you want to call onInputChange as soon as the Shiny app starts then you need to use the following JavaScript code instead of listening for click events.

    $(function() {
      setTimeout(function() {
        Shiny.onInputChange("mydata", userID);
      }, 10)
    });
    
    0 讨论(0)
提交回复
热议问题