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



我正在尝试在我的R Shiny应用程序上使用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)

任何帮助将不胜感激。



为此,您可以使用函数 Shiny.setInputValue(id,value((参见通过 JavaScript 与 Shiny 通信(。 此函数允许将输入变量从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)

最新更新