【问题标题】:R Shiny get IP adress return from asynchronous call javascriptR Shiny从异步调用javascript中获取IP地址返回
【发布时间】:2020-02-07 13:29:24
【问题描述】:

我正在尝试在我的 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)

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript jquery r asynchronous shiny


    【解决方案1】:



    为此,您可以使用函数 Shiny.setInputValue(id,value)(参见 Communicating with Shiny via JavaScript)。 该函数可以将输入变量从 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)
    

    【讨论】:

    • 非常感谢。正是我需要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2013-12-26
    • 2015-01-05
    • 2010-11-06
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多