1. Pryr安装
由于项目pryr,还没有发布到CRAN,仅支持从github安装。要使用devtools包来通过github来安装,在https://github.com/hadley/pryr中给出了安装pryr的方法。由于我的电脑之前并没有安装devtools,所以先从安装devtools开始。
安装的环境为:
- linux:Linux version 3.19.0-16-generic (buildd@komainu)
- R:R version 3.1.2
- Platform: x86_64-pc-linux-gnu (64-bit)
devtools安装:
依赖库:
~sudo apt-get install libcurl4-openssl-dev
~sudo apt-get install libxml++2.6-dev
使用root权限打开R:
~sudo R
>install.packages("devtools","/home/beili/R/packages")
>.libPaths("/home/beili/R/packages")
>search()
[1] ".GlobalEnv" "package:devtools" "package:stats"
[4] "package:graphics" "package:grDevices" "package:utils"
[7] "package:datasets" "package:methods" "Autoloads"
[10] "package:base"
pryr安装
>.libPaths("/home/beili/R/packages")
>library(devtools)
>install_github("hadley/pryr")
出现下面信息时,说明安装完成:
installing to /home/beili/R/packages/pryr/libs
** R
** tests
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (pryr)
注:在未安装依赖包时,如果直接安装devtools一般会出现下面的错误,警告信息可能不尽相同,把相应的包安装进去进行了:
警告信息:
1: In install.packages("devtools", pkg) :
安装程序包‘XML’时退出狀態的值不是0
2: In install.packages("devtools", pkg) :
安装程序包‘RCurl’时退出狀態的值不是0
3: In install.packages("devtools", pkg) :
安装程序包‘httr’时退出狀態的值不是0
4: In install.packages("devtools", pkg) :
安装程序包‘rversions’时退出狀態的值不是0
5: In install.packages("devtools", pkg) :
安装程序包‘devtools’时退出狀態的值不是0
2.pryr使用
下面是大神写的一篇使用pryr的文章http://blog.fens.me/r-pryr/除了引用文章中的基础方法外,下面是自己实践的时候遇到的一些问题和体会。
2.1 匿名函数f()
通过使用f()函数,可以实现创建匿名函数,在单行完成函数定义、调用、运算的操作。函数f(...,body)的最后一个参数是函数的主体,通过f定义的函数,可以自动识别定义的函数的参数(通过新使用的变量是否使用“<-”或者“=”赋值来判断,这也就造成了在函数内部不能使用与参数相同的变量进行迭代等等操作,必须进行重新copy一个变量),下面是个例子:
> g=f({for(i in 1:10) x<-x+1})
> g function () { for (i in 1:10) x <- x + 1 }
> g()
错误: 找不到对象'x'
函数第一没有定义对象x,再者并没有定义返回的表达式,所以正确的形式如下:
> g=f({x=0;for(i in 1:10) x=x+1;x})
> g()
[1] 10
如果想传递过来参数则如下:
> f({x=arg1;for(i in 1:10) x=x+1;x^arg2})
function (arg1, arg2)
{
x = arg1
for (i in 1:10) x = x + 1
x^arg2
}
> f({x=arg1;for(i in 1:10) x=x+1;x^arg2})(1,2)
[1] 121
2.2 创建函数make_function()
通过使用make_function()函数,可以通过make_function()函数的3个参数,来创建一个普通的函数,从而实现动态性。
> f <- function(x) x + 3
> g <- make_function(alist(x = ), quote(x + 3))
# The components of the functions are identical
> identical(formals(f), formals(g))
> identical(body(f), body(g))
> identical(environment(f), environment(g))
# But the functions are not identical because f has src code reference
> identical(f, g)
> attr(f, "srcref") <- NULL
# Now they are:
> stopifnot(identical(f, g))
2.3 partial()创建缺省参数的函数
使用方式:
partial(`_f`, ..., .env = parent.frame(), .lazy = TRUE)
其中 .lazy: If ‘TRUE’ arguments evaluated lazily, if ‘FALSE’,evaluated when ‘partial’ is called.
这个函数与标准的缺省值函数使用差别不大。下面是包自带的例子:
> f <- partial(runif, n = rpois(1, 5)) > f function (...) runif(n = rpois(1, 5), ...) > f() [1] 0.6129163 0.3181137 > f() [1] 0.83188673 0.97501092 0.07324238 0.89498934 0.36405785 > f(min=1,max=10) [1] 2.890537 7.088587 3.883414 8.733926
2.4....