簡體   English   中英

在 R 會話中訪問本地提供的文件

[英]Access locally served files within an R session

語境

為了測試我正在編寫的 R 包的 Web 功能,我嘗試在本地使用httpuv包提供文件,以便我可以使用頁面的離線副本運行測試。

問題

然而, curl似乎並不想與httpuv配合得httpuv ——特別是,當嘗試使用curl讀取托管文件時(例如,使用curl::curl()curl::curl_fetch_memory() ),請求掛起,如果沒有手動中斷,最終會超時。

最小的例子

# Serve a small page
server <- httpuv::startServer("0.0.0.0", port = 9359, app = list(
  call = function(req) {
    list(
      status = 200L,
      headers = list("Content-Type" = "text/html"),
      body = "Some content..."
    )
  }
))

# Attempt to retrieve content (this hangs)
page <- curl::curl_fetch_memory(url = "http://127.0.0.1:9359")

httpuv::stopServer(server)

現在的進展

服務器啟動后,在終端運行curl -v 127.0.0.1:9359按預期返回內容。 此外,如果我打開 RStudio 的新實例並嘗試在該新 R 會話中curl::curl_fetch_memory() (而舊會話仍處於打開狀態),它將完美運行。

callr鼓舞,我一直在玩callr一段時間,想也許可以在某個后台進程中啟動服務器,然后像往常一樣繼續。 不幸的是,到目前為止,我用這種方法還沒有取得任何成功。

非常感謝任何見解或建議!

當你能回來回答你問的問題時,是不是一種很棒的感覺!

httpuv::startServer()文檔:

startServer 綁定指定的端口並在后台運行的線程上偵聽連接。 這個后台線程處理 I/O,當它接收到一個 HTTP 請求時,它會調度調用 app 中用戶定義的 R 函數來處理請求。 這個調度是通過 later() 完成的。 當 R 調用堆棧為空時——換句話說,當交互式 R 會話在命令提示符下處於空閑狀態時——R 將自動運行計划調用。 但是,如果調用堆棧不為空——如果 R 正在評估其他 R 代碼——那么回調將不會執行,直到調用堆棧為空或 run_now() 函數被調用。 該函數告訴 R 執行任何由 later() 安排的回調。 service() 函數本質上是 run_now() 的包裝器。

換句話說,如果我們想在收到請求后立即響應,我們必須使用httpuv::service()明確地這樣做。 像下面這樣的東西可以解決問題!

s <- callr::r_session$new()
on.exit(s$close())

s$call(function() {
  httpuv::startServer("0.0.0.0", port = 9359, app = list(
    call = function(req) {
      list(
        status = 200L,
        headers = list("Content-Type" = "text/html"),
        body = "Some content...")
      )
    }
  ))

  while (TRUE) httpuv::service()
})  

# Give the server a chance to start
Sys.sleep(3)
page <- curl_fetch_memory(url = "http://127.0.0.1:9359")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM