R Shiny получить IP-адрес возврата из асинхронного вызова JavaScript - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь получить IP-адрес клиента с помощью JavaScript в моем приложении R Shiny. alert выводит правильный результат, функция работает в javascript как отдельная функция, но возвращается NULL в R.

Я подозреваю, что проблема в асинхронном вызове, который не ожидает немедленного возвратапотому что alert дает правильный результат. Я попытался изменить мой javascript, чтобы он работал синхронно, но все равно получаю тот же результат.

Может быть принят другой способ получения IP-адреса в R.

Файл 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)

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 10 октября 2019



Для этого вы можете использовать функцию Shiny.setInputValue (id, value) (см. Связь с Shiny через JavaScript ). Эта функция позволяет установить входную переменную из javascript в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...