在应用程序加载中将javascript变量读入shiny / R.

时间:2014-05-17 20:08:41

标签: javascript r wordpress shiny shiny-server

我想要做的是在iframe中加载闪亮的应用时从wordpress登录用户获取用户ID。然后,此变量可用于保存和修改特定于用户的数据。


我已经通过将以下代码添加到wordpress页面获得了一些方法:

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

然后将其设为javascript变量:

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




使用找到here的示例,如果单击div框,我可以获取变量。

ui.R:

library(shiny)

shinyUI( bootstrapPage(

  # include the js code
  includeScript("get_user_id.js"),

  # a div named mydiv
  tags$div(id="mydiv",
           style="width: 50px; height :50px; left: 100px; top: 100px;
           background-color: gray; position: absolute"),

  # an element for unformatted text
  verbatimTextOutput("results")
))

server.R:

shinyServer(function(input, output, session) {
  output$results = renderPrint({
    input$mydata
  })
})

get_user_id.js:

$(document).ready(function() {
  document.getElementById("mydiv").onclick = function() {
  document.domain = "DOMAIN_NAME_HERE"; 
  var username = parent.username; 
  var userID = parent.userID; 
    Shiny.onInputChange("mydata", userID);
  };
});



请注意,域名(或IP)是必需的,因为iframe中加载的闪亮应用程序位于wordpress页面之外的另一个端口上。 iframe 应由以下人员创建:

<script type="text/javascript"> 
document.domain = "DOMAIN_NAME_HERE"; 
</script> 
<iframe id="example1" style="border: none; width: 100%; height: 500px;" src="APP_URL" height="150" frameborder="0"></iframe>




但我想要的是在应用程序加载后立即获取变量,以便我可以在应用程序中使用它来将数据保存到数据库等。
我找不到任何办法这样做。我无法使用“.onload”或我尝试过的几种jquery替代方法来实现这一目标。任何提示都将受到高度赞赏。




编辑:也发布在这里:https://groups.google.com/forum/#!topic/shiny-discuss/3XM2mHuzqRs

2 个答案:

答案 0 :(得分:3)

Erik Westlund非常友好地提供了以下解决方案。


<强> 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;

如上所述,请记住更改域名。并在加载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") 
))

根据需要更改脚本的路径。


<强> 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() ) ) 

})


将此添加到包含iframe的页面:

PHP从wordpress获取变量。

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

然后将其设为java变量:

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

设置域名和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>

答案 1 :(得分:0)

如果您想在Shiny应用程序启动后立即致电LinkedHashMap,则需要使用以下JavaScript代码,而不是侦听点击事件。

onInputChange