Archive for R

看网上教程,最后选择了这种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,测试运行一下没啥问题。数据类型的转换问题还需要详细研究一下。

Continue

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菜单执行单元测试

Continue

网上最常用的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)

Continue

包初始化创建我是用的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时候也是用的全名,导致查错误也每个结果。搞了半天发现名字不对。

Continue

没有系统学过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文件中,这个文件名是约定俗成的。

Continue

要写项目就需要想到这些,因为没有经验,只能网上找一些项目或者搜一些规范。大部分都是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官方文档了

Continue

刚研究了log4r的使用,就想着也不是什么大包,自己也没写r项目的经验,看看源码学习一下吧。然后在appender里看file_appender的时候,看到了一个force函数。 本能的去Rstudio上查了一下文档,因为软件看文档比终端好一点。然后发现这个不简单啊。 幸好之前写过python对这种坑机制有了解,感觉上R与Python很多地方相似。 安装文档说明,R函数的参数在定义的闭包中使用的时候,比如在循环和apply函数的调用,会导致从变量作用域中获取这些参数变量,也就是所谓的惰性求值。虽然我现在看的文档中还没有涉及变量作用域的问题,感觉在R中应该和在Python中是差不多的,循环体是不具有变量作用范围的保证的。而force函数能保证这个参数被执行求值,从而保证闭包里作用域里的变量的值的变化。 ?force文档里有个例子很好的说明了这一点。

Continue

看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上的新接口混用,导致日志文件没更新成功。后来才意识到文档不对。 日志文件在输出第一条日志的时候才会创建。

Continue

找了点关于python和r语言的对比文章看了看,总结了下边几条。 R 统计模型新 可视化,动态报告稍微领先 统计,数据分析,领域专用 Python 效率领先 语言稳定规范 数据清洗方便 工程开发,领域广 我刚开始学习R语言,还没有太多体会,不过从语言层面,感觉R语言的语法分析系统都不完善,不知道为啥函数参数的缺少只能运行时知道,不知道有没有别的作用。

Continue

第一步添加需要的密钥: 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;")

Continue