专业的R语言使用者,你们的.Rprofile文件中有什么内容?

287
我一直发现其他人的创业配置文件对语言非常有用和有启发性。此外,虽然我已经为BashVim进行了一些自定义,但对于R我什么也没有。
例如,我一直想要在窗口终端中为输入和输出文本使用不同的颜色,甚至可能进行语法高亮显示。

31
很遗憾这个问题已经关闭,但我强烈认为正确的答案是“什么也没有”。建议不要使用.Rprofile文件,在每个项目的顶层保留一个初始化脚本,并在项目中每个脚本开始时调用它。这将通过源代码控制使你的工作可复制给其他用户。不过,这里有一些很棒的答案!我会把其中一些想法放到自己的初始化脚本中。 - geneorama
19
很好的评论,但我会稍微修饰一下你的回答:.Rprofile 文件不应包含任何改变结果的代码。您可以包括更改 R 外观的内容(例如 options("width"=160))或更改默认 CRAN 镜像的内容(例如 options(repos = c(CRAN = "http://cran.rstudio.com")))。然而,不要加载包、更改常用函数的默认选项、定义函数等。您的代码应该是独立完整的,并且可以在没有特定 .Rprofile 文件的情况下重新产生结果。 - user2503795
@ geneorama,我应该把自定义函数放在哪里?也许在单独的包/命名空间中?这在.Rprofile中容易/可能吗? - Aaron McDaid
2
@aaron-mcdaid 首先,@user2503795 绝对是正确的,.Rprofile 是一个适当的地方来进行应用程序更改。其次,你的问题应该是一个独立的 SO 问题。我尝试使用类似于我们在 食品检查 项目中所做的模式(请参见代码布局和每个脚本顶部的初始化步骤)。 - geneorama
24个回答

99

这是我的代码。它无法帮助您进行着色,但我从ESS和Emacs获取颜色...

options("width"=160)                # wide display with multiple monitors
options("digits.secs"=3)            # show sub-second time stamps

r <- getOption("repos")             # hard code the US repo for CRAN
r["CRAN"] <- "http://cran.us.r-project.org"
options(repos = r)
rm(r)

## put something this is your .Rprofile to customize the defaults
setHook(packageEvent("grDevices", "onLoad"),
        function(...) grDevices::X11.options(width=8, height=8, 
                                             xpos=0, pointsize=10, 
                                             #type="nbcairo"))  # Cairo device
                                             #type="cairo"))    # other Cairo dev
                                             type="xlib"))      # old default

## from the AER book by Zeileis and Kleiber
options(prompt="R> ", digits=4, show.signif.stars=FALSE)


options("pdfviewer"="okular")         # on Linux, use okular as the pdf viewer

我不确定,但我认为现在X11.options已被windows.options所取代。这是真的吗? - Manuel Ramón
不必创建 r 然后再删除它,你可以将其放在 local({ }) 块中。虽然如此,这是一个很好的答案,我喜欢 X11 配置! - Aaron McDaid
是的,在help(Startup)中展示的local({ ... })是我最近在Rprofile.site中经常使用的。已经有一段时间没有用到X11 hack了 :) - Dirk Eddelbuettel

61

我不喜欢每次都要输入完整的单词“head”、“summary”和“names”,所以我使用别名。

你可以将别名放入你的.Rprofile文件中,但是你必须使用函数的完整路径(例如utils :: head),否则它将无法工作。

# aliases
s <- base::summary
h <- utils::head
n <- base::names

编辑:回答你的问题,你可以使用colorout包,在终端中拥有不同的颜色。很酷!:-)


11
我认为在调试过程中,n 会亲自咬我的后部。 - Roman Luštrik
3
适合进行交互式 R 使用,但不具备可移植性,不要将它们放入你的(书面)代码中! - Vince
25
如果您删除全局环境中的所有对象,那么上面的别名也将被删除。您可以通过将这些隐藏在一个环境中来防止这种情况。.startup <- new.env() assign("h", utils::head, env=.startup) assign("n", base::names, env=.startup) assign("ht", function(d) rbind(head(d,6),tail(d,6)) , env=.startup) assign("s", base::summary, env=.startup) attach(.startup) - Kevin Wright
12
我尝试了这个好主意,但是我已经用了 "s",所以我执行了 sum <- base::summary。那个并不是一个好主意。 - Tom
1
关于 colorout 包的说明:"""该软件包已被归档:它使用了 CRAN 政策不允许的非 API 入口点。""" - isomorphismes
显示剩余3条评论

60
options(stringsAsFactors=FALSE)

虽然我没有在我的.Rprofile中实际设置这个选项,因为它可能会破坏我的合作者的代码,但我希望它是默认设置。为什么呢?

1)字符向量使用更少的内存(但只是略微减少);

2)更重要的是,我们可以避免以下问题:

> x <- factor(c("a","b","c"))
> x
[1] a b c
Levels: a b c
> x <- c(x, "d")
> x
[1] "1" "2" "3" "d"

以及

> x <- factor(c("a","b","c"))
> x[1:2] <- c("c", "d")
Warning message:
In `[<-.factor`(`*tmp*`, 1:2, value = c("c", "d")) :
  invalid factor level, NAs generated

在某些情况下,因子非常有用(例如在图形排序中实现),但大多数情况下都是麻烦。


Eduardo - 有趣,不使用因素的好处是什么? - medriscoll
30
我希望你能成为R语言的默认设置。 - Iterator
5
请注意,在32位系统上,字符向量似乎只使用较少的内存(约200字节)。在64位系统上,因子使用的内存要少得多。 https://stat.ethz.ch/pipermail/r-help/2012-August/321919.html - Ari B. Friedman
+1 感谢指出因子变量存在的一些主要问题。在我看来,SAS 的格式系统比此更具有许多优势。当从文本中读取时,stringsAsFactors 始终设置为 false。然而,在数据传输方面,我尽可能避免从电子表格中读取。 - AdamO
5
在 R 版本 >=4.0.0 中,这是新的默认设置。太好了! - Andreï V. Kostyrka

28

我喜欢保存我的R命令历史记录,并在每次运行R时都可用:

在shell或.bashrc中:

export R_HISTFILE=~/.Rhistory

在 .Rprofile 文件中:

.Last <- function() {
        if (!any(commandArgs()=='--no-readline') && interactive()){
                require(utils)
                try(savehistory(Sys.getenv("R_HISTFILE")))
        }
}

27

这是我的方法。我经常使用主要的CRAN仓库,并编写了代码,使得可以轻松地引入正在开发中的软件包代码。

.First <- function() {
    library(graphics)
    options("repos" = c(CRAN = "http://cran.r-project.org/"))
    options("device" = "quartz")
}

packages <- list(
  "describedisplay" = "~/ggobi/describedisplay",
  "linval" = "~/ggobi/linval", 

  "ggplot2" =  "~/documents/ggplot/ggplot",
  "qtpaint" =  "~/documents/cranvas/qtpaint", 
  "tourr" =    "~/documents/tour/tourr", 
  "tourrgui" = "~/documents/tour/tourr-gui", 
  "prodplot" = "~/documents/categorical-grammar"
)

l <- function(pkg) {
  pkg <- tolower(deparse(substitute(pkg)))
  if (is.null(packages[[pkg]])) {
    path <- file.path("~/documents", pkg, pkg)
  } else {
    path <- packages[pkg]
  }

  source(file.path(path, "load.r"))  
}

test <- function(path) {
  path <- deparse(substitute(path))
  source(file.path("~/documents", path, path, "test.r"))  
}

27

这里有两个我发现在Windows系统上很方便的函数。

第一个函数将 \ 转换为 /

.repath <- function() {
   cat('Paste windows file path and hit RETURN twice')
   x <- scan(what = "")
   xa <- gsub('\\\\', '/', x)
   writeClipboard(paste(xa, collapse=" "))
   cat('Here\'s your de-windowsified path. (It\'s also on the clipboard.)\n', xa, '\n')
 }

第二个选项会在一个新的资源管理器窗口中打开当前工作目录。

getw <- function() {
    suppressWarnings(shell(paste("explorer",  gsub('/', '\\\\', getwd()))))
}

3
这个.repath正在如此地进入我的.Rprofile - Waldir Leoncio
1
我编写了一个RStudio插件,其中包括此功能。您只需复制路径,从RStudio中选择一个菜单,转换后的路径将插入到光标位置。这应该可以节省一些按键操作。 - dracodoc
1
我非常讨厌Windows路径问题。我认为我可能有一个更好的解决方案。我添加了一段代码片段,所以我只需要输入wpp然后按tab键,我的复制路径就会出现。以下是代码。 snippet wpp \r paste(""", gsub("\\", "/", readClipboard()), """, sep = "")`` - jamesguy0121

18

我知道一个更动态的技巧,可以使用完整的终端宽度,它尝试从COLUMNS环境变量(在Linux上)读取:

tryCatch(
  {options(
      width = as.integer(Sys.getenv("COLUMNS")))},
  error = function(err) {
    write("Can't get your terminal width. Put ``export COLUMNS'' in your \
           .bashrc. Or something. Setting width to 120 chars",
           stderr());
    options(width=120)}
)

这样,即使您调整终端窗口的大小,R也会使用全宽。

1
COLUMNS未设置时,您可以尝试width = as.integer(system('tput cols',intern=TRUE)作为备选方案。 - shabbychef

17

这是我在 Mac 和 Linux 上设计的 ~/.Rprofile 内容。

这些内容可以更方便地查看错误信息。

options(showWarnCalls=T, showErrorCalls=T)

我不喜欢CRAN的菜单选择,所以将其设置为一个好的选择。

options(repos=c("http://cran.cnr.Berkeley.edu","http://cran.stat.ucla.edu"))

更多历史!

Sys.setenv(R_HISTSIZE='100000')

以下内容适用于在 Mac OSX 终端上运行(我更喜欢终端而不是 R.app,因为它更稳定,可以按目录组织工作;还要确保获得一个好的 ~/.inputrc)。默认情况下,你会得到一个 X11 显示屏,这看起来不太好;相反,这将提供与 GUI 相同的石英显示屏。if 语句应该捕获在 Mac 终端上运行 R 的情况。
f = pipe("uname")
if (.Platform$GUI == "X11" && readLines(f)=="Darwin") {
  # http://www.rforge.net/CarbonEL/
  library("grDevices")
  library("CarbonEL")
  options(device='quartz')
  Sys.unsetenv("DISPLAY")
}
close(f); rm(f)

预加载一些库,

library(plyr)
library(stringr)
library(RColorBrewer)
if (file.exists("~/util.r")) {
  source("~/util.r")
}

其中util.r是一个我使用的随机杂物袋,处于不稳定状态。

另外,由于其他人提到了控制台宽度,这里是我的做法。

if ( (numcol <-Sys.getenv("COLUMNS")) != "") {
  numcol = as.integer(numcol)
  options(width= numcol - 1)
} else if (system("stty -a &>/dev/null") == 0) {
  # mac specific?  probably bad in the R GUI too.
  numcol = as.integer(sub(".* ([0-9]+) column.*", "\\1", system("stty -a", intern=T)[1]))
  if (numcol > 0)
    options(width=  numcol - 1 )
}
rm(numcol)

这实际上不在.Rprofile中,因为您每次调整终端窗口大小都必须重新运行它。我将其放在util.r中,然后根据需要进行源代码调用。


如果我在xterm窗口中打开R(通过键入“R”),它是否应该打开类似于R GUI的窗口?通过将此.Rprofile添加到我的主目录,我看不出任何区别。 - Richard Herron
不,这样做可以将所有内容保留在控制台中。然而,当你绘制图形时,它会使用比默认的X11显示设备更智能的显示设备。 - Brendan OConnor
我觉得这些窗口调整大小的脚本可以打包成一个有用的包。你同意吗? - isomorphismes

17

我的大部分个人功能和加载的库都在Rfunctions.r脚本中。

source("c:\\data\\rprojects\\functions\\Rfunctions.r")


.First <- function(){
   cat("\n Rrrr! The statistics program for Pirates !\n\n")

  }

  .Last <- function(){
   cat("\n Rrrr! Avast Ye, YO HO!\n\n")

  }


#===============================================================
# Tinn-R: necessary packages
#===============================================================
library(utils)
necessary = c('svIDE', 'svIO', 'svSocket', 'R2HTML')
if(!all(necessary %in% installed.packages()[, 'Package']))
  install.packages(c('SciViews', 'R2HTML'), dep = T)

options(IDE = 'C:/Tinn-R/bin/Tinn-R.exe')
options(use.DDE = T)

library(svIDE)
library(svIO)
library(svSocket)
library(R2HTML)
guiDDEInstall()
shell(paste("mkdir C:\\data\\rplots\\plottemp", gsub('-','',Sys.Date()), sep=""))
pldir <- paste("C:\\data\\rplots\\plottemp", gsub('-','',Sys.Date()), sep="")

plot.str <-c('savePlot(paste(pldir,script,"\\BeachSurveyFreq.pdf",sep=""),type="pdf")')

1
嘿,我考虑给一个R GUI命名为“Arrr” - 这是一种更容易添加一些海盗好玩的方法。 - Sharpie
2
啊,谢谢。知道启动 R 时我不是唯一一个想到海盗的人感觉很好。:-) 我发誓有一天我会克服这个问题的。 - ars
1
它解释了为什么@Dirk在他的脚本中设置了钩子... - James
1
"Avast Ye"是非标准海盗语。我更喜欢符合标准的海盗语。此外,它的意思是“紧紧抓住”,所以放在开头不是更有意义吗? :P - naught101
2
实际上,最终这是完全有道理的。因为在退出 r 域后,我们会回到其周围较小的环境,并且必须再次处理电子表格和临时文本文件。 - kpierce8

16
以下是我的列表:
.First <- function () {
  options(device="quartz")
}

.Last <- function () {
  if (!any(commandArgs() == '--no-readline') && interactive()) {
    require(utils)
    try(savehistory(Sys.getenv("R_HISTFILE")))
  }
}

# Slightly more flexible than as.Date
# my.as.Date("2009-01-01") == my.as.Date(2009, 1, 1) == as.Date("2009-01-01")
my.as.Date <- function (a, b=NULL, c=NULL, ...) {
  if (class(a) != "character")
    return (as.Date(sprintf("%d-%02d-%02d", a, b, c)))
  else
    return (as.Date(a))
}

# Some useful aliases
cd <- setwd
pwd <- getwd
lss <- dir
asd <- my.as.Date # examples: asd("2009-01-01") == asd(2009, 1, 1) == as.Date("2009-01-01")
last <- function (x, n=1, ...) tail(x, n=n, ...)

# Set proxy for all web requests
Sys.setenv(http_proxy="http://192.168.0.200:80/")

# Search RPATH for file <fn>.  If found, return full path to it
search.path <- function(fn,
     paths = strsplit(chartr("\\", "/", Sys.getenv("RPATH")), split =
                switch(.Platform$OS.type, windows = ";", ":"))[[1]]) {
  for(d in paths)
     if (file.exists(f <- file.path(d, fn)))
        return(f)
  return(NULL)
}

# If loading in an environment that doesn't respect my RPATH environment
# variable, set it here
if (Sys.getenv("RPATH") == "") {
  Sys.setenv(RPATH=file.path(path.expand("~"), "Library", "R", "source"))
}

# Load commonly used functions
if (interactive())
  source(search.path("afazio.r"))

# If no R_HISTFILE environment variable, set default
if (Sys.getenv("R_HISTFILE") == "") {
  Sys.setenv(R_HISTFILE=file.path("~", ".Rhistory"))
}

# Override q() to not save by default.
# Same as saying q("no")
q <- function (save="no", ...) {
  quit(save=save, ...)
}

# ---------- My Environments ----------
#
# Rather than starting R from within different directories, I prefer to
# switch my "environment" easily with these functions.  An "environment" is
# simply a directory that contains analysis of a particular topic.
# Example usage:
# > load.env("markets")  # Load US equity markets analysis environment
# > # ... edit some .r files in my environment
# > reload()             # Re-source .r/.R files in my environment
#
# On next startup of R, I will automatically be placed into the last
# environment I entered

# My current environment
.curr.env = NULL

# File contains name of the last environment I entered
.last.env.file = file.path(path.expand("~"), ".Rlastenv")

# Parent directory where all of my "environment"s are contained
.parent.env.dir = file.path(path.expand("~"), "Analysis")

# Create parent directory if it doesn't already exist
if (!file.exists(.parent.env.dir))
  dir.create(.parent.env.dir)

load.env <- function (string, save=TRUE) {
  # Load all .r/.R files in <.parent.env.dir>/<string>/
  cd(file.path(.parent.env.dir, string))
  for (file in lss()) {
    if (substr(file, nchar(file)-1, nchar(file)+1) %in% c(".r", ".R"))
      source(file)
  }
  .curr.env <<- string
  # Save current environment name to file
  if (save == TRUE) writeLines(.curr.env, .last.env.file)
  # Let user know environment switch was successful
  print (paste(" -- in ", string, " environment -- "))
}

# "reload" current environment.
reload <- resource <- function () {
  if (!is.null(.curr.env))
    load.env(.curr.env, save=FALSE)
  else
    print (" -- not in environment -- ")
}

# On startup, go straight to the environment I was last working in
if (interactive() && file.exists(.last.env.file)) {
  load.env(readLines(.last.env.file))
}

1
请勿在公共网站上发布您所在机构代理的地址。 - dalloliogm
13
dalloliogm,这是一个私有(非公共)IP地址。全世界有数十万台计算机使用完全相同的IP地址。祝你好运,试图找出哪一个是我的! - Alfred J Fazio
2
Alfred,你有没有找到一种方法在.Rprofile中定义函数(就像你在这里做的那样),而不会在使用ls()命令时显示它们,除非用一个点号开头命名?我在使用ls()命令时看到了我定义的太多函数,导致杂乱无章。谢谢。 - Keith
4
将它们分配到一个环境中,并将该环境附加到搜索路径中,然后进行清理。如果这些函数在单独的文件中,您可以直接将其源代码加载到该环境中。请参阅?new.env?assign?sys.source。如果您无法让其正常工作,请在SO上发布新的问题,我相信您会得到答案。 - Gavin Simpson
您的 my.as.Date 可能被 Lubridate 软件包所取代。我说的对吗? - isomorphismes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接