一个使用R的高端技巧:向R发送代码,返回结果

Linux,WinXP至Win10下都试验有效,不过有一个不可避免的连带影响:占用R内置的HTTP服务器,所以在使用这个方法时R的帮助文档服务器不可用。

非官方方法,数据密集型研究中或许用得上,速度快,甚至可以嵌入VBA编写的Excel用户定义函数。这个方法服务于下述类型的任务:比如从Excel里通过简单的VBA编程将数据和代码通过HTTP通信发送到R,运算完再返回结果,原理是在R中建立了一个HTTP服务器,专用于处理其他进程(程序)送达的数据或代码段。注意,该方法不适合于建构诸如http://corpora.lancs.ac.uk/sigtest/的网络应用,仅适合本地使用。

R服务器端代码:
#RHttpdHackServer.R
httpd <- function (path, query, postBody, ...)
{result <- capture.output(source(textConnection(rawToChar(postBody)))$value)
list(paste(result, collapse="\n"), "text/plain", NULL, 200L)}
env <- getNamespace("tools")
unlockBinding("httpd", env)
assign("httpd", httpd, env)
lockBinding("httpd",env)
status <- .Call(tools:::startHTTPD, "127.0.0.1", 12345)
print(status)

运行这段代码,启动R服务器

VBA端代码两个示例:
Private Sub PostCode2R1()
Dim req As New WinHttpRequest
'Using WinHttpRequest requires referencing (引用) "Microsoft WinHTTP Services, version 5.1",
req.Open "POST", "http://127.0.0.1:12345/"
req.Send "demo()"
Debug.Print req.ResponseText
End Sub

Private Sub PostCode2R2()
Dim req As Object
Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.Open "POST", "http://127.0.0.1:12345/"
req.Send "citation()"
Debug.Print req.ResponseText
End Sub
 
Back
顶部