2

我正在尝试使用 R 和 Rook 创建一个 Web 应用程序。

我看到了这个例子http://www.road2stat.com/cn/r/rook.html并且我已经能够在我的命令行中复制它(从 R 内部调用它)。但我希望多个用户能够同时连接到应用程序,所以我想像 Jeff 所说的那样部署它 - http://jeffreyhorner.tumblr.com

我已经能够复制 Rook 软件包附带的大多数示例,如 Jeff 在他的博客中所述。其中包括: summary.r rnorm RookTestApp

我现在遇到的问题是我无法使前一个示例工作(即-www.road2stat)每次我尝试将文件上传到它时都会给我一条错误消息。当我使用命令行时不会发生这种情况。

我的错误信息是这样的:

内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。

这是我部署应用程序的路径

<Location /test/Visbin>
SetHandler r-handler
RFileEval /usr/lib/R/library/Rook/exampleApps/visbin.R:Rook::Server$call(newapp)
</Location>

这是我要复制的应用程序

newapp = function(env) {
req = Rook::Request$new(env)
res = Rook::Response$new()
res$write('Choose a Binary file to Train:\n')
res$write('<form method="POST" enctype="multipart/form-data">\n')
res$write('<input type="file" name="data">\n')
res$write('xdim:\n')
res$write('<form method="POST">\n')
res$write('<input type="text" name="xdim" value="12">\n')
res$write('ydim:\n')
res$write('<form method="POST">\n')
res$write('<input type="text" name="ydim" value="25">\n')
res$write('ncolors:\n')
res$write('<form method="POST">\n')
res$write('<input type="text" name="ncolors" value="8">\n')
res$write('<input type="submit" name="Go!">\n</form>\n<br>')

myNormalize = function (target) {
return((target - min(target))/(max(target) - min(target)))
}

if (!is.null(req$POST())) {
data = req$POST()[["data"]]
hash = digest(data$tempfile, algo = "md5", file = TRUE)
destFile = file(data$tempfile, "rb")
k = floor((file.info(data$tempfile)$size/16)) - 2
doneFile = readBin(con = destFile, what = "raw", n = 2 * 8 * k)
close(destFile)
tmpFile0 = rbind(doneFile[seq(1, (2 * 8 * k) - 1, 2)], doneFile[seq(2, (2 * 8 * k), 2)])
tmpFile1 = paste(tmpFile0[1, ], tmpFile0[2, ], sep = "")
initMat = matrix(strtoi(tmpFile1, 16L), ncol = 8, byrow = TRUE)
normMat = myNormalize(initMat)
trainedSOM = kohonen::som(normMat, grid = somgrid(xdim = req$POST()[["xdim"]], ydim = req$POST()[["ydim"]], "hexagonal"))
png(paste("/tmp/", hash, ".png", sep = ""))
plot(trainedSOM, type = "dist.neighbours", palette.name = rainbow, ncolors = as.numeric(req$POST()[["ncolors"]]), main = "")
dev.off()
res$write(paste("<img src='", s$full_url("pic"), "/", hash, ".png'", " />", sep = ""))
}
res$finish()

}

这是我的命令行指令:

s = Rhttpd$new()
s$add(app = newapp, name = "visbin")
s$add(app = File$new("/tmp"), name = "pic")
s$start()
s$browse("visbin")

任何人都可以请我指出正确的方向或指导我找到可以帮助我做到这一点的资源。

PS我使用的是fedora 15,并且安装了Rapache-1.2.0。

4

0 回答 0