Shiny Server 对浏览器 URL 做出反应,但对来自 httr 的 GET 没有反应

Shiny Server reacts to browser URL but not GET from httr

我正在尝试编写一个 RShiny 应用程序,它将接受 URL,根据 URL 中的参数读入一个文件并写入另一个文件。我的方法基于 R Shiny REST API communication 这个答案。

下面是生成应用程序的最小功能代码 - 当我从像 Chrome 这样的浏览器 运行 它时(例如,只需输入地址 http://127.0.0.1/?outDest=test2),它将创建一份文件。但是如果我尝试使用来自 httr 的 GET 调用来调用它,它会生成一个错误

could not find function "data_read"

这是有道理的,因为至少我的理解是该功能可用于服务器而不是 ui。

所以我想做的是让 UI 读入并解析 GET 查询 - 然后在服务器端触发 reactiveEvent 以获取该数据,但我无法获取生成我想要的输出。

RShiny 有办法处理这个问题吗?或者另一个包裹 - 我应该看水管工吗?

非常感谢, 奥丹

library(shiny)
library(rjson)
library(callr)
library(httr)


data_read <- function(x) {
    
    json = fromJSON(file = x)
    dat_df <- bind_rows(lapply(json,as.data.frame))
    
}


    
shiny_UI <- function(req) {
  # The `req` object is a Rook environment
  # See https://github.com/jeffreyhorner/Rook#the-environment
  if (identical(req$REQUEST_METHOD, "GET")) {   
    x = data_read("C:/Users/Z0049Y2S/Documents/test.json")
    query_params <- parseQueryString(req$QUERY_STRING)
    #print(query_params)
    if(length(query_params$outDest) ){
        output_Destination = query_params$outDest
        print(output_Destination)
        write.csv("Hello",paste0(output_Destination,".csv"))
    }
    fluidPage(
      h1("Accepting POST requests from Shiny")
    )
  } 
}

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

Shiny 应用程序真正设计用于通过 websockets 与客户端通信。对于处理 HTTP 请求,您可能需要考虑一种不同的方法,例如一个 plumber API.

这是一个量身定制的示例:

p <- callr::r_bg(
  function() {
    library(plumber)

    pr() |>
      pr_handle("GET", "/", function(outFile) {
        write("Hello", outFile)
      }) |>
      pr_run(port = 9850)
  }
)

httr::GET("http://127.0.0.1:9850?outFile=hello.txt")
readLines("hello.txt")

p$kill()