Выполнение массовых вызовов FHIR API от R / Shiny - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь сделать массовые вызовы FHIR API из R. Я наткнулся на пакет R [RonFHIR][1]. Но я застрял с endpoint needs authorization и не понял, как передать запрос авторизации или каковы требуемые параметры авторизации? На странице github есть пример, но он не может заставить его работать.

В качестве альтернативы, есть среда SMARTonFHIR, у нее также есть открытый сервер, но я все равно получаю то же самое.

library(RonFHIR)
client <- fhirClient$new("https://r3.smarthealthit.org")
Warning: The endpoint requires authorization.

Я пытаюсь сделать вызовы API из R / Shiny и получить образцы данных FHIR в сеанс R. Любое решение с вышеуказанным пакетом или альтернативное решение с Python / R будет полезно. Или возможность использования клиента JS SMARTonFHIR непосредственно в блестящем будет идеальной. Я пытался использовать клиент JS SMART / FHIR напрямую, а не в зависимости от пакета RonFhir. В основном это пример Плункер Но безуспешно. Ниже приведен код. Вывод на блестящий пользовательский интерфейс просто names list NULL, когда переменная todaysDiagnoses отправляется на блестящий. Если var smart возвращается из JS в R, он просто возвращает все ссылки, но не информацию о пациенте.

app.r

library(shiny)
library(shinyjs)

if (interactive()) {
  # testing url
  options(shiny.port = 8100)
  APP_URL <- "http://localhost:8100/"
} else {
  # deployed URL
  APP_URL <- "https://servername/path-to-app"
}

ui <- fluidPage(
  tags$head(
    tags$script(src = "https://code.jquery.com/jquery-2.0.3.min.js")
  ),
  tags$script(src = "https://cdn.rawgit.com/smart-on-fhir/client-js/v0.1.8/dist/fhir-client.js"),
  includeScript(path = "get-data.js"),
  includeScript(path = "demo-settings.js"),
  bootstrapPage(
    # include the js code
    # includeScript("demo-settings.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 <- function(input, output) {
  output$results = renderPrint({
    print(input$mydata)
  })

}
shinyApp(ui = ui, server)


#demo-settings.js$(document).ready(function() {
document.getElementById("mydiv").onclick = function() {
  var smart = FHIR.client({
    serviceUrl:'https://r2.smarthealthit.org',
    patientId:'smart-1137192'
  })

  var todaysDiagnoses = smart.api.search({
    type:'Condition',
    query:{
      dateRecorded:'2014-05-01'
    }
  })
  Shiny.onInputChange("mydata", todaysDiagnoses)
}

Shiny.addCustomMessageHandler("myCallbackHandler", function(color) {
  document.getElementById("mydiv").style.backgroundColor = color
    })
})

демо-settings.js

$(document).ready(function() {

  document.getElementById("mydiv").onclick = function() {
    //var number = Math.random();

var smart = FHIR.client({
  serviceUrl: 'https://r2.smarthealthit.org',
  patientId: 'smart-1137192'
});

  var todaysDiagnoses = smart.api.search({
  type: 'Condition',
  query: {dateRecorded: '2014-05-01'}
  });

    Shiny.onInputChange("mydata", todaysDiagnoses);
  };

  Shiny.addCustomMessageHandler("myCallbackHandler",
    function(color) {
      document.getElementById("mydiv").style.backgroundColor = color;
    }
  );
});

Get-data.js

    function getPatientName(pt) {
    if (pt.name) {
        var names = pt.name.map(function(name) {
            return name.given.join(" ") + " " + name.family.join(" ");
        });
        return names.join(" / ")
    } else {
        return "anonymous";
    }
}

function getMedicationName(medCodings) {
    var coding = medCodings.find(function(c) {
        return c.system == "http://www.nlm.nih.gov/research/umls/rxnorm";
    });

    return coding && coding.display || "Unnamed Medication(TM)"
}

function displayPatient(pt) {
    document.getElementById('patient_name').innerHTML = getPatientName(pt);
}

var med_list = document.getElementById('med_list');

function displayMedication(medCodings) {
    med_list.innerHTML += "<li> " + getMedicationName(medCodings) + "</li>";
}

// Create a FHIR client (server URL, patient id in `demo`)
var smart = FHIR.client(demo),
    pt = smart.patient;

// Create a patient banner by fetching + rendering demographics
smart.patient.read().then(function(pt) {
    displayPatient(pt);
});

// A more advanced query: search for active Prescriptions, including med details
smart.patient.api.fetchAllWithReferences({
        type: "MedicationOrder"
    }, ["MedicationOrder.medicationReference"]).then(function(results, refs) {
            results.forEach(function(prescription) {
                if (prescription.medicationCodeableConcept) {
                    displayMedication(prescription.medicationCodeableConcept.coding);
                } else if (prescription.medicationReference) {
                    var med = refs(prescription, prescription.medicationReference);
                    displayMedication(med && med.code.coding || []);
                }
            });
...