用户自编函数

R的一个最大优点之一就是用户可以自行添加函数。事实上,R中的许多函数都是由已有函数构成的。一个函数的结构看起来大致如此:

myfunction <- function(arg1, arg2, ...){

  statements

  return(object)

}

下面让我们看一个使用switch结构的用户自编函数,此函数可让用户选择输出当前日期的格式。在函数声明中为参数指定的值将作为默认值。在函数mydate()中,如果未指定type则long将成为默认的日期格式。

mydate <- function(type="long"){
    switch(type,
        long = format(Sys.time, "%A %B %d %Y),
        short = format(Sys.time, "m-%d-%y),
        cat(type, "is not a recognized type\n")
    )
}

在创建好自己的函数之后,我们希望在每个会话中都能直接使用它们。 程序员可以通过自定义启动环境设置R选项、设置工作目录、加载常用的包、加载用户编写的函数、设置默认的CRAN下载网站以及执行其他常见任务。

可以通过站点初始化文件(Rprofile.site)或目录初始化文件(.Rprofile)自定义R的环境。R在启动时会执行这样几个文本文件的代码。在启动时,R会加载R_HOME/etc目录中的Rprofile.site文件,其中R_HOME是一个环境变量。然后R会在当前目录中寻找.Rprofile文件。如果R没有在当前目录找到这个文件,它就会到用户的主目录去寻找。可以通过Sys.getenv("R_HOME")和getwd()来确认R_HOME和HOME和当前工作目录。

可以在这些文件中放入两个特殊的函数。每个R会话开始时都会执行.First()函数,而每个会话结束时都会执行.Last()函数。代码示例:

options(papersize = "a4")    //设置常用选项
options(editor = "notepad")
options(pager = "internal")
options(tab.width = 2)
options(width = 130)
options(graphics.record = TRUE)
options(show.signif.starts = FALSE)

options(prompt = "> ")    //设置R交互提示符
options(continue = "+ ")

.libPaths("c:/my    _R_library")    //设置本地库路径

local({r <- getoptions("repos")    //设置默认的CRAN镜像
        r["CRAN"] <- "http://cran.case.edu/"
        options(repos = f)})

.First <- function(){    //启动函数
    library(lattice)
    library(Hmsic)
    source("C:/mydir/myfunctions.R")
    cat("\nWelcome at", date(), "\n")
}

.Last <- function(){    //会话结束函数
    cat("\nGoodbye at ", date(), "\n")
}

 

其中,有以下几点需要注意:

  • 设置.libPaths值可以为R目录树之外的扩展包创建一个本地库。这样可以在升级时保持某个扩展包不变。
  • 设置默认的CRAN镜像就不必每次执行install.packages()命令时都选择镜像了。
  • .Frist()函数中可以加载常用的库,也可以加载保存自己编写的常用函数的源代码文件。
  • .Last()函数中可以执行某些清理操作包括保存命令历史记录、保存程序输出和保存数据文件。

2014-2-10 12:18:00