29

Jsonで入力ファイルを受け取り、分類子を介して実行し、分類されたJsonオブジェクトを返す光沢のあるアプリがあります。アプリが API と通信できるようにしたい。API がファイルを Shiny アプリに投稿して、その作業を行い、分類されたオブジェクトを返すようにしたいと考えています。基本的に、Shiny アプリは、ファイルが投稿されるまでバックグラウンドで待機し、その後処理を実行する必要があります。httr パッケージから GET を使用して、URL からファイルを取得できることを知っています。これをshiny.serverファイルに入れることができますが、getコマンドのファイル名がわかっている場合は問題ありません

ただし、API からのファイル名は異なります。APIからのPostリクエストに従って、これを動的にする方法はありますか。

4

2 に答える 2

0

これは Joe Cheng の gist here"http_methods_supported"に基づいており、UI に属性を追加しhttpResponse、リクエストに応答するために使用することを提案しています。

以下のコードは、バックグラウンド R プロセスで光沢のあるアプリを開始します。アプリが起動された後、親プロセスは虹彩data.frameを UI に送信します。

UI 関数では、req$PATH_INFOがチェックされ ( を参照uiPattern = ".*")、数値列が 10 倍され ( query_params$factor)、json 文字列として返されます。

library(shiny)
library(jsonlite)
library(callr)
library(datasets)

ui <- function(req) {
  # The `req` object is a Rook environment
  # See https://github.com/jeffreyhorner/Rook#the-environment
  if (identical(req$REQUEST_METHOD, "GET")) {
    fluidPage(
      h1("Accepting POST requests from Shiny")
    )
  } else if (identical(req$REQUEST_METHOD, "POST")) {
    # Handle the POST
    query_params <- parseQueryString(req$QUERY_STRING)
    body_bytes <- req$rook.input$read(-1)
    if(req$PATH_INFO == "/iris"){
      postedIris <- jsonlite::fromJSON(rawToChar(body_bytes))
      modifiedIris <- postedIris[sapply(iris, class) == "numeric"]*as.numeric(query_params$factor)
      httpResponse(
        status = 200L,
        content_type = "application/json",
        content = jsonlite::toJSON(modifiedIris, dataframe = "columns")
      )
    } else {
      httpResponse(
        status = 200L,
        content_type = "application/json",
        content = '{"status": "ok"}'
      )
    }
  }
}
attr(ui, "http_methods_supported") <- c("GET", "POST")

server <- function(input, output, session) {}

app <- shinyApp(ui, server, uiPattern = ".*")
# shiny::runApp(app, port = 80, launch.browser = FALSE, host = "0.0.0.0")
shiny_process <- r_bg(function(x){ shiny::runApp(x, port = 80, launch.browser = FALSE, host = "0.0.0.0") }, args = list(x = app))

library(httr)
r <- POST(url = "http://127.0.0.1/iris?factor=10", body = iris, encode = "json", verbose())
recievedIris <- as.data.frame(fromJSON(rawToChar(r$content)))
print(recievedIris)
shiny_process$kill()

追加の例を提供し ( の使用方法も示しています)、関数のより良い説明を目指している、この関連する PRも確認してください。session$registerDataObjhttpResponse

于 2022-02-10T11:10:23.220 に答える