5

我编写了一个小型 Java 客户端,它在Rserver上进行一些计算。为此,服务器端有functions.r- 和libraries.r文件,必须先获取这些文件,然后才能进行实际计算。

目前我在每个新连接上加载文件:

import org.rosuda.REngine.Rserve.RConnection;

public class RserveTester {

  public void doOnRserve() {
    RConnection c = new RConnection( "rserve.domain.local" );
    c.login( "foo", "user" );
    c.eval("source(\"/home/rserve/lib/libraries.r\")");
    c.eval("source(\"/home/rserve/lib/functions.r\")");
    c.eval( "someCalculation()" )
    c.close();
  }  
}

由于客户端的某些事件在一分钟内doOnRserve()调用了几次。

我的问题是:是否有可能只采购一次库,以便在所有新的 RSession 期间都可以使用它们而无需单独采购?

我在客户端尝试了类似的东西:

c.serverSource("/home/rserve/lib/libraries.r" )
c.serverSource("/home/rserve/lib/functions.r" )

这给了我以下异常(不知道为什么这不起作用eval):

 org.rosuda.REngine.Rserve.RserveException: serverSource failed, request status: access denied (local to the server)

我可以用特定的启动 Rserve.Rprofile吗?

编辑:

基本上,有三种可能的方法:

  1. 让 /home/rserve/.Rprofile 获取 .r 文件。但是每次我打电话时,这个接缝都可以找到它们new RConnection()
  2. 启动 Rserve 时将源命令直接传递给 R(不知道如何执行此操作)。
  3. 我的首选方法:使用 serverSource() 从客户端执行此操作,这会引发这些“拒绝访问”异常。

编辑2:

保留版本 v0.6-8 (338)

适用于 x86_64-pc-linux-gnu 的 R 版本 2.15.2。

4

2 回答 2

7

这可以通过source在配置文件中添加行来轻松完成,即

source "/foo/bar.R"

在启动时/etc/Rserv.conf将来源/foo/bar.R。如果要使用另一个配置文件,请使用--RS-conf命令行参数来指定它。最后,Rserve 1.x 也支持--RS-source命令行选项。

如果文件路径中没有引号,则可能会出现 File Not Found Error。

顺便说一句:您提到serverSource()拒绝访问 - 这意味着您没有在 Rserve 中启用控制命令(control enable在配置或--RS-enable-control命令行中)。

PS:Rserve 问题请使用 stats-rosuda-devel 邮件列表。

于 2012-11-29T21:22:31.383 回答
1

是的你可以。永远记住这一点:

R> fortunes::fortune("Yoda")

Evelyn Hall: I would like to know how (if) I can extract some of the information 
             from the summary of my nlme.
Simon Blomberg: This is R. There is no if. Only how.
   -- Evelyn Hall and Simon 'Yoda' Blomberg
      R-help (April 2005)

R> 

或者作为Rserve州的文档:

\description{ 以守护程序模式启动 Rserve(仅限 unix)。

任何与 Rserve 无关的附加参数将直接传递给底层 R。有关配置、使用和命令行参数,请参阅 http://www.rforge.net/Rserve上的在线文档。使用 \code{R CMD Rserve --help} 获得简要帮助。

于 2012-11-25T18:08:05.593 回答