目标:与OpenCPU AJAX调用一起使用OpenCPU。
用例:,我需要连接Apache凤凰数据库并获取一些数据。根据这些数据,我应该做分析。因此,要与菲尼克斯连接,我使用的是rjdbc(菲尼克斯不支持任何其他连接选项)。
环境: public.opencpu.org
以下是我所尝试的:
html
<textarea>
library(RJDBC)
.. do some data fetching and then r statistics
</textarea>
<br />
<button id="submitbutton" >Execute</button>
<br />
<br />
<div id="output">
</div>javascript
<script type="text/javascript">
//When Document is Ready
$(function () {
var baseurl = "https://public.opencpu.org";
//because identity is in base
ocpu.seturl(baseurl+"/ocpu/library/base/R");
//actual handler
$("#submitbutton").on("click", function(){
//arguments
var mysnippet = new ocpu.Snippet($("#input").val());
//perform the request
var req = ocpu.call("identity", {
"x" : mysnippet
}, function(session){
session.getStdout(function(outtxt){
$("#output-txt").text(outtxt);
});
});
//if R returns an error, alert the error message
req.fail(function(){
alert("Server error: " + req.responseText);
$("#output").hide();
});
req.always(function(){
$("button").removeAttr("disabled");
});
});
});
</script>场景
当我单击“执行”按钮时,从文本区域(此处库(RJDBC)和一些db操作)获取用户输入的值,并发送ajax post并以以下错误进行响应
google铬控制台日志:
POST https://public.opencpu.org/ocpu/library/base/R/identity 400 (Bad Request)
OpenCPU error HTTP 400
package 'rJava' could not be loaded希望这能让我们更清楚。
需要确认rJava是否与OpenCPU一起工作,如果是这样的话,是否有可能解决这个问题?
发布于 2016-09-08 14:01:13
我的解决方案的核心如下所示。代码是从具有某些日志记录的R6类中提取的。为了记录正在发生的事情,我在private$log命令中留下了一些内容,但如果运行此代码的某个版本,您可能会忽略它。类似地,有些函数的调用并不需要完成工作,我将主机信息打包到列表中,而不是传递密码等的单个变量。简而言之,我在这里提供的代码是不可复制的。
但是,我在这个要旨提供的代码应该是可复制的(一旦您提供了数据库连接,classPath和driverClass)。这个要点已经进行了0次清理,所以里面有大量的代码,严格地说,这对完成工作来说是多余的。这些代码中没有一个是漂亮的、优雅的等等--通常我对它感到羞愧,但本着共享的精神,我还是把它放在了上面。
解释性代码段:
jvmNode <- makeCluster(1, methods=FALSE, port = sample(11000:11999,1), rscript_args="--vanilla")
connected <- isTRUE(try(clusterEvalQ(jvmNode, 2)==2, silent=TRUE))
private$log$finest("forkable node started")
clusterEvalQ(jvmNode,{library(DBI);library(rJava);library(RJDBC)})
clusterEvalQ(jvmNode, systemRAMFree <- function() {
#in GB, platform dependent
as.numeric(system('FREE_KB=$(($(echo `sed -n \'2p;3p;4p\' < /proc/meminfo | sed "s/ \\+/ /g" | cut -d\' \' -f 2 ` | sed "s/ /+/g")));echo $FREE_KB', intern=TRUE))/1024/1024
})
clusterEvalQ(jvmNode, options(java.parameters = paste0("-Xmx",systemRAMFree(),"g")))
hostInformation <- private$hostInformation
classPath <- "~/redshift/redshiftJDBC41.jar"
driverClass <- private$driverClass
java.parameters <- getOption("java.parameters")
toExportList <- list(statement,driverClass, classPath, hostInformation, java.parameters)
names(toExportList) <- c("statement","driverClass","classPath", "hostInformation", "java.parameters")
toExport <- as.environment(toExportList)
clusterExport(jvmNode, ls(toExport), envir=toExport)
clusterEvalQ(jvmNode, options(java.parameters = java.parameters))
clusterEvalQ(jvmNode, rJava::.jinit())
private$log$finest("JVM Started")
clusterEvalQ(jvmNode, drv <- RJDBC::JDBC(driverClass, classPath))
private$log$finest("Driver obtained")
clusterEvalQ(jvmNode, conn <- dbConnect(drv,
url = hostInformation$host,
user = hostInformation$user,
password = hostInformation$password))
private$log$debug(logPrefix("query:", statement))
result <- try(clusterEvalQ(jvmNode, dbGetQuery(conn, statement))[[1]])
clusterEvalQ(jvmNode, dbDisconnect(conn))
stopCluster(jvmNode)https://stackoverflow.com/questions/26999214
复制相似问题