Rprofile -- 自定義你的R啟動方式

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ǔ)充~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容