[英]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.