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()
我正在尝试编写一个 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()