gpt4 book ai didi

r - 以编程方式向 R 服务器发送查询

转载 作者:行者123 更新时间:2023-12-02 01:51:00 25 4
gpt4 key购买 nike

请考虑以下示例(使用 2 个 R session ):

第一个 R session - R 服务器

library(svSocket)
startSocketServer()

第二次 R session - R 客户端

library(svSocket)
con <- socketConnection(host = "localhost", port = 8888, blocking = FALSE)

value<-"setosa"
evalServer(con, tmp, value) # first call to the server
evalServer(con, head(iris[iris$Species==tmp,])) # second call to the server
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa

要发送上述查询,我​​需要一个两步过程,我首先将参数保存在服务器中,然后使用它们来查询表。

问题

只需一步完成相同的操作。例如,使用 paste 构建查询并将其发送到服务器,就像我在 PHP + MySQL 中所做的那样。基本上,我需要避免不同的用户在第一次和第二次调用服务器之间覆盖 tmp。上述命令将在同时连接 30 到 50 个用户的网络应用程序后面运行,因此我认为可能会出现这种不便。

最佳答案

一个可能的答案

$ query <- paste0('evalServer(con,"head(iris[iris$Species==\'', value,'\',])")')
$ eval(parse(text=query))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa

这可以完成工作,但有点像拨号...代码非常困惑且难以阅读。

最终解决方案:

我最终修改/简化了 evalServer。此版本只接受一个字符串,其中包含要在服务器中评估的表达式

evalServer2 <- function (con, expr) 
{
if(!is.character(expr)) stop("expr must be a character string containing the expression to evaluate in the server.")
cat("..Last.value <- try(eval(parse(text = \"", expr, "\"))); .f <- file(); dump(\"..Last.value\", file = .f); flush(.f); seek(.f, 0); cat(\"\\n<<<startflag>>>\", gsub(\"<pointer: [0-9a-fx]+>\", \"NULL\", readLines(.f)), \"<<<endflag>>>\\n\", sep = \"\\n\"); close(.f); rm(.f, ..Last.value); flush.console()\n",
file = con, sep = "")
objdump <- ""
endloc <- NULL
while (!length(endloc)) {
obj <- readLines(con, n = 1000, warn = FALSE)
if (!length(obj)) {
Sys.sleep(0.01)
next
}
endloc <- grep("<<<endflag>>>", obj)
if (length(endloc))
obj <- obj[0:(endloc[length(endloc)] - 1)]
objdump <- c(objdump, obj)
}
startloc <- grep("<<<startflag>>>", objdump)
if (!length(startloc))
stop("Unable to find <<<startflag>>>")
objdump <- objdump[-(1:startloc[length(startloc)])]
nospace <- grep("[^ ]$", objdump)
nospace <- nospace[nospace < length(objdump)]
for (i in rev(nospace)) {
objdump[i] <- paste(objdump[i], objdump[i + 1], sep = "")
objdump[i + 1] <- ""
}
objcon <- textConnection(objdump)
on.exit(close(objcon))
source(objcon, local = TRUE, echo = FALSE, verbose = FALSE)
return(..Last.value)
}

允许:

> x <- "5 + 4"
> evalServer2(con, x)
[1] 9

相反,evalServer 将检索存储在 R 服务器中的名为 x 的变量

> evalServer(con, x, 23)
[1] TRUE
> evalServer(con, x)
[1] 23
> evalServer2(con, "x")
[1] 23

关于r - 以编程方式向 R 服务器发送查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22743589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com