在Rserve上只获取一次r文件

时间:2012-11-25 17:17:47

标签: java r rserve

我编写了一个小型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)

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

修改

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

  1. 让/home/rserve/.Rprofile来源.r文件。但是,每当我拨打new RConnection()
  2. 时,这种接缝都会找到它们
  3. 启动Rserve时将源命令直接传递给R(不知道怎么做)。
  4. 我的首选方法:使用serverSource()从客户端执行此操作,抛出这些“拒绝访问”的异常。
  5. EDIT2:

    Rserve版本v0.6-8(338)

    版本2.15.2 for x86_64-pc-linux-gnu。

2 个答案:

答案 0 :(得分:7)

通过在配置文件中添加source行,即放置

,可以轻松完成
source "/foo/bar.R"
/etc/Rserv.conf中的

将在启动时获得/foo/bar.R。如果要使用其他配置文件,请使用--RS-conf命令行参数指定它。最后,Rserve 1.x也支持命令行上的--RS-source选项。

如果文件路径中没有引号,则可能会显示“找不到文件错误”。

BTW:您提到serverSource()访问被拒绝 - 这意味着您没有在Rserve中启用控制命令(配置中为control enable或命令行上为--RS-enable-control。)

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

答案 1 :(得分: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}来表示   简短的帮助。