看网上教程,最后选择了这种rpc调用的方式,这种方式可以提前启动R虚拟机,R程序造成的崩溃不会影响到java程序。另一种方式是JRI,全名是Java/R Interface
第一步R安装Rserve,这里有点问题就是最好root权限安装,我看文档这种方式需要源码安装,并且有$R_HOME/bin权限。所以直接root启动r然后安装了,install.packages("Rserve")。这里试了一下R INSTALL 好像只能安装本地的包。最后决定安装官网的最新版本,目前还没在CRAN中。install.packages("Rserve",,"http://rforge.net")
第二步启动R server,命令行执行 R CMD Rserve,这个就是上边说的daemon模式,文档说只支持unix系统,windows还不行。默认启动端口6311.看参数好像只能指定端口,不支持指定IP。看文档只能通过配置文件去指定是否允许远程访问。写一行remote enable就行了,我没在默认/etc/Rserv.conf 改,直接参数指定的文件。
第三步java客户端连接,这里需要两个jar包,官方网站能下载,看版本有点老,安装包也带。目录在 /home/xx/R/x86_64-pc-linux-gnu-library/4.0/Rserve/java/ 包的安装目录下。然后javac -classpath ./REngine.jar:./Rserve.jar:. test.java,测试运行一下没啥问题。数据类型的转换问题还需要详细研究一下。
Read more...
Archive for R
R语言devtools包和单元测试testthat包
devtools包能够方便在开发R语言包时,测试,文档生成,安装包等操作。
testthat包是单元测试的包,这里要写单元测试了。
devtools的安装需要提前安装一些依赖,不然安装会报错,我的是ubuntu系统,需要安装一下依赖
apt install libxml2-dev libcurl4-openssl-dev
安装完这俩软件,再安装就可以了,具体是否依赖其他软件就不清楚了,我这里是少这俩,官方文档也不太友好。
我是先创建的package在安装的devtools,发现现在没有好的方法添加test文件了,我是使用的testthis包进行创建的,这个三个包都是一个公司出的,testthis包的内容没看全,看起来是devtools所有相关功能都是在这里实现的。
use_test()
可以安装目录文件创建tests文件及内容,还有NAMESPACE文件依赖的修改等
可以使用use_test('hello.R')生成制定文件的test文件,我看文件命名规则基本生成test-hello.R,context为hello。
test_that("multiplication works", {
expect_equal(2 * 2, 4)
})
执行test()或者使用RStudio里的build菜单执行单元测试
Read more...
R语言使用RMariaDB连接数据库获取数据
网上最常用的R语言连接数据库的包是RMySQL,但是我看RMySQL推荐使用RMariaDB,RMySQL以后会不在维护。所以使用RMariaDB了,这个使用上应该没啥区别,因为他们都使用了DBI包,规范了数据库接口的定义。
结合上一篇讲全局变量的问题,我存在了options里代码如下
db_config <- getOption("db_config")
con <- dbConnect(RMariaDB::MariaDB(), dbname=db_config$db, username=db_config$user, password=db_config$password, host=db_config$host)
print(con)
print(dbListTables(con))
dbDisconnect(con)
Read more...
R语言自定义包编写安装
包初始化创建我是用的rstudio,创建的r package项目。
然后可以build菜单选择build source package,右侧的build窗口可以check,install,非常快的点击就完成了
也可以用命令做
R CMD build tpk
R CMD CHECK
R CMD INSTALL tpk
这里我傻了吧唧,命令行操作的时候, install 后面跟了个tar包全名,导致后边用install.package时候也是用的全名,导致查错误也每个结果。搞了半天发现名字不对。
Read more...
R语言包中全局变量、常量问题
没有系统学过r的坏处体现出来了,现在想到什么就要去搜什么。
常量好像在R中是不存在的,sof上看到一个例子,但是没啥用,还不如直接注释声明。
a <- 1
lockBinding("a", globalenv())
a <- 2
Error: cannot change value of locked binding for 'a'
非包中全局变量,可以使用<<-来保证局部变量引用的全局变量,但包内的不知道。通过查找,基本实现方式一个是通过myenv <- new.env()来实现,这个返回类型为environment,还没有细看。
还有一种实现方式是使用.onLoad,在包加载的时候可以调用的一些列函数。一般声明在zzz.R文件中,这个文件名是约定俗成的。
Read more...
R语言,项目目录设计,和一些代码规范
要写项目就需要想到这些,因为没有经验,只能网上找一些项目或者搜一些规范。大部分都是package的项目,所以我找文章找到一些规范。
https://www.r-bloggers.com/2018/08/structuring-r-projects/
这篇文章介绍比较全面,目录结构大部分按他这个来了。其中对于library(package)载入包的情况进行了说明,可以使用package::function(arg1, arg2, ...)来调用不常用包的函数,这个方式的好处是不会打乱命名空间,除非知道这些包没有冲突,不然确实出现问题不一定好排查。(提前看文章避免了坑)
还有一些代码规范,但是我应该之会借鉴一部分变量命名方式,像参数空格这种我就不准备用了。
http://stat405.had.co.nz/r-style.html
然而查了一大顿之后,我决定还是把项目组织成R语言 package的目录结构,因为那个比较规范,也有文档测试啥的目录,很清晰。
具体需要参考https://cran.r-project.org/doc/manuals/R-exts.pdf官方文档了
Read more...
R语言不明确的作用域机制和force函数的作用
刚研究了log4r的使用,就想着也不是什么大包,自己也没写r项目的经验,看看源码学习一下吧。然后在appender里看file_appender的时候,看到了一个force函数。
本能的去Rstudio上查了一下文档,因为软件看文档比终端好一点。然后发现这个不简单啊。
幸好之前写过python对这种坑机制有了解,感觉上R与Python很多地方相似。
安装文档说明,R函数的参数在定义的闭包中使用的时候,比如在循环和apply函数的调用,会导致从变量作用域中获取这些参数变量,也就是所谓的惰性求值。虽然我现在看的文档中还没有涉及变量作用域的问题,感觉在R中应该和在Python中是差不多的,循环体是不具有变量作用范围的保证的。而force函数能保证这个参数被执行求值,从而保证闭包里作用域里的变量的值的变化。
?force文档里有个例子很好的说明了这一点。
Read more...
R语言日志包log4r
看log4r的名字就感觉跟log4j有渊源啊,其中还要好多个日志包,最后决定log4r和logging里边一个,logging是仿的python日志模块的包,但是我最后没选这个,主要是因为接口设计的不太好,就选择了log4r。
安装包
install.packages("log4r")
使用
library(log4r)
logger <- logger("INFO", appenders = file_appender("log/base.log"))
info(logger, "info")
debug(logger, "debug")
error(logger, "error")
使用的时候有几个点需要注意,
我目前安装最新的版本是 0.3.2,但是?log4r的文档版本是0.2,然后我用那个文档里的老接口和github上的新接口混用,导致日志文件没更新成功。后来才意识到文档不对。
日志文件在输出第一条日志的时候才会创建。
Read more...
R语言和Python简单对比
找了点关于python和r语言的对比文章看了看,总结了下边几条。
R
统计模型新
可视化,动态报告稍微领先
统计,数据分析,领域专用
Python
效率领先
语言稳定规范
数据清洗方便
工程开发,领域广
我刚开始学习R语言,还没有太多体会,不过从语言层面,感觉R语言的语法分析系统都不完善,不知道为啥函数参数的缺少只能运行时知道,不知道有没有别的作用。
Read more...
R语言ubuntu编程环境安装
第一步添加需要的密钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
第二步,选择安装镜像网站,添加软件源
sudo add-apt-repository "deb https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
第三步,安装R语言包
sudo apt install r-base
第四步,验证:
终端输入R,启动交互模式。
print("hello world;")
Read more...