Rprofile 文件位于R安裝目錄下的library/base/R/Rprofile,沒錯,是在base包下面。
相當(dāng)于配置文件的功能,打開之后可以看到預(yù)設(shè)了很多東西,比如:
.GlobalEnv <- globalenv()
T <- TRUE
F <- FALSE
options(scipen = 0)
options(stringsAsFactors = TRUE)
此外,有兩個特殊的函數(shù):.First 和.Last,顧名思義,分別是在R終端啟動和結(jié)束時運行,默認(rèn)貌似是沒有的(讓我想到了構(gòu)造析構(gòu)??)。
因此,用戶可以在此文件自定個人偏好、常用函數(shù)、預(yù)設(shè)變量以及一些有趣的東西,接下來展示一些我添加的一些內(nèi)容。
interactive
展示之前先解釋一下interative函數(shù)的功能,它可以判斷當(dāng)前R是否處于交互環(huán)境,有些功能我們可能只在R交互運行時才會用到,比如歡迎結(jié)束語、某些包等等,這時候就可以使用這個函數(shù)來判斷以決定是否導(dǎo)入這些額外的功能。
這樣做在速度和邏輯性上都會有所提升。
啟動/結(jié)束語
自定義.First 和.Last函數(shù)可以實現(xiàn)這個功能:
.First <- function(){
# wellcome
if(interactive())
cat(paste0("Hi ", Sys.info()[["user"]], ", wellcome to R!\n"))
}
以及:
.Last <- function(){
if(interactive())
cat("See you next time!\n")
}
自動加載包
這個功能看起來不錯,其實當(dāng)你進(jìn)入R時運行search()時,你會發(fā)現(xiàn)已經(jīng)有包已經(jīng)被加載進(jìn)來了:
> search()
[1] ".GlobalEnv" "package:stats" "package:graphics"
[4] "package:grDevices" "package:utils" "package:datasets"
[7] "package:methods" "Autoloads" "package:base"
其實是Rprofile這個文件實現(xiàn)的功能:
local({dp <- Sys.getenv("R_DEFAULT_PACKAGES")
if(identical(dp, "")) ## it fact methods is done first
dp <- c("datasets", "utils", "grDevices", "graphics",
"stats", "methods")
else if(identical(dp, "NULL")) dp <- character(0)
else dp <- strsplit(dp, ",")[[1]]
dp <- sub("[[:blank:]]*([[:alnum:]]+)", "\\1", dp) # strip whitespace
options(defaultPackages = dp)
})
.First.sys <- function()
{
for(pkg in getOption("defaultPackages")) {
res <- require(pkg, quietly = TRUE, warn.conflicts = FALSE,
character.only = TRUE)
if(!res)
warning(gettextf('package %s in options("defaultPackages") was not found', sQuote(pkg)),
call. = FALSE, domain = NA)
}
}
可以看出自動加載了"datasets", "utils", "grDevices", "graphics", "stats", "methods"這些包,因此我們往里面加入其他的包名,這樣就可以在R啟動時自動自動加載了。
但是建議最好不要在原始內(nèi)容上修改,而是單獨寫在.First函數(shù)里,比如我們想自動加載ggplot2這個包,可以這樣做:
.First <- function(){
suppressPackageStartupMessages(require("ggplot2", quietly = TRUE, warn.conflicts = FALSE, character.only = TRUE))
}
另外,有的包只需要在交互使用時才需要載入,比如用于彩色話屏幕輸出的colorout包,這時也需要用到interactive函數(shù):
if(interactive())
if(Sys.getenv("TERM") == "xterm-256color")
library("colorout")
colorout安裝:
git clone https://github.com/jalvesaq/colorout.git
R CMD INSTALL colorout
但是需要權(quán)衡是否真正需要自動載入某些包,因為這意味著啟動R需要消耗更多的時間。
自定義函數(shù)
自動source自己編寫的函數(shù):
source("my_functions.R")
設(shè)置鏡像
options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")
options(repos="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
其他設(shè)置
options(stringsAsFactors = FALSE) # 不自動將string轉(zhuǎn)換為Factor
# options(scipen = 999, digits = 6) # 不用科學(xué)計數(shù)法顯示,保留6位有效數(shù)字,這個還是使用默認(rèn)的吧,有時候還是挺有用的
options(max.print = 99) # 限制最大打印行數(shù),打印99999那么多行干嘛喲!
options("width" = 100) # 設(shè)置每行最大顯示字符個數(shù),當(dāng)你屏幕比較大時或許有用
options(continue = " ") # 換行輸入時以空格開頭,默認(rèn)是+,當(dāng)你選擇粘貼時非常有用
options(warn = 2, error = recover) # 據(jù)說提醒和報錯方式更友好,遇到了再看效果把,默認(rèn): options(warn=0, error=NULL)
See more: ?options or The options mechanism in R.
匯總
最后把這些代碼整合一起,并放到Rprofile文件內(nèi)容的最后以覆蓋前面的預(yù)設(shè):
########## my set
.First <- function(){
cat(R.version.string, "\n") # 打印R版本
loadp <- function(...){
pkgs = as.character(substitute(list(...)))[-1]
suppressMessages(for(pkg in pkgs) require(pkg, character.only = TRUE))
}
loadp(colorout) # 可續(xù)寫
if(interactive()){
cat(paste0("Hi ", Sys.info()[["user"]], ", wellcome to R!\n"))
if(Sys.getenv("TERM") == "xterm-256color")
library("colorout")
}
options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")
options(repos="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
options(stringsAsFactors = FALSE) # 不自動將string轉(zhuǎn)換為Factor
# options(scipen = 999, digits = 6) # 不用科學(xué)計數(shù)法顯示,保留6位有效數(shù)字,這個還是使用默認(rèn)的吧,有時候還是挺有用的
options(max.print = 999) # 限制最大打印行數(shù)/項,打印99999那么多行干嘛喲!
# options("width" = 100) # 設(shè)置每行最大顯示字符個數(shù),當(dāng)你屏幕比較大時或許有用
options(continue = " ") # 換行輸入時以空格開頭,默認(rèn)是+,當(dāng)你選擇粘貼時非常有用
# options(warn = 2) # 據(jù)說提醒方式更友好,遇到了再看效果把,默認(rèn): options(warn=0, error=NULL)。更:千萬別這樣設(shè),不痛不癢的warning 也會轉(zhuǎn)成 error,wdnmd
# source and library
source("~/.yyds")
library("yyds")
}
.Last <- function(){
if(interactive())
cat("See you next time!\n")
}
##########
上面有個loadp函數(shù)也贈送給大家,可以同時載入多個包,包名可以不加引號,功能類似某包的一個函數(shù):
loadp(ggplot2, reshape2, GenomicRanges)
如果以后還有更多有趣的東西再補(bǔ)充~