Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R从异步调用javascript获取IP地址返回_Javascript_Jquery_R_Asynchronous_Shiny - Fatal编程技术网

R从异步调用javascript获取IP地址返回

R从异步调用javascript获取IP地址返回,javascript,jquery,r,asynchronous,shiny,Javascript,Jquery,R,Asynchronous,Shiny,我正在尝试在我的R Shining应用程序上使用javascript获取客户端IP地址alert打印正确的结果,函数在javascript中独立工作,但在R中返回为NULL 我怀疑问题在于异步调用没有等待立即返回,因为alert提供了正确的结果。我试图修改javascript以使其同步,但仍然得到相同的结果 在R中获取IP地址的另一种方法也可以接受 文件app.R: library(shiny) library(shinyjs) ui <- function(req) { fluid

我正在尝试在我的R Shining应用程序上使用javascript获取客户端IP地址
alert
打印正确的结果,函数在
javascript
中独立工作,但在R中返回为
NULL

我怀疑问题在于异步调用没有等待立即返回,因为
alert
提供了正确的结果。我试图修改javascript以使其同步,但仍然得到相同的结果

在R中获取IP地址的另一种方法也可以接受

文件
app.R

library(shiny)
library(shinyjs)

ui <- function(req) {
  fluidPage(
    useShinyjs(),
    extendShinyjs(text = "
    shinyjs.getIP = function(){
      $.getJSON('https://ipapi.co/json/').then(function(data){
        alert(JSON.stringify(data.ip, null, 2));
        return JSON.stringify(data.ip, null, 2);
      });
    }

    shinyjs.getIP2 = function(){    
      var jqxhr = $.getJSON('https://ipapi.co/json/');
      jqxhr.done(function(data) {
        alert(JSON.stringify(data.ip, null, 2));
        return JSON.stringify(data.ip, null, 2);
      });
    }
    ")
  )
}

server <- function(input, output, session) {
  ip <- reactive(js$getIP())

  observe({
    print(ip())
  })

  ip2 <- reactive(js$getIP2())

  observe({
    print(ip2())
  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(shinyjs)
用户界面

为此,可以使用函数shinny.setInputValue(id,value)(请参阅)。 此函数允许将输入变量从javasript设置为R

library(shiny)

ui <- fluidPage(
  tags$script('
  var coords = $.getJSON("https://ipapi.co/json/", function(data) {
   Shiny.setInputValue("ip", data.ip); //set value from data.ip in js to input$ip in R
  });'
  ),
  verbatimTextOutput("value")
)
server <- function(input, output) {
  output$value <- renderText({ input$ip })
}
shinyApp(ui, server)
库(闪亮)

非常感谢。正是我需要的!