专家用户,什么's在你的。rprofile ?

我总是发现其他人的创业简介文件对这门语言既有用又有指导意义。此外,虽然我对BashVim进行了一些定制,但对R没有任何定制。

例如,我一直想要的一件事是在窗口终端中输入和输出文本的颜色不同,甚至可能是语法高亮显示。

71776 次浏览

这是我的。它不会帮助你着色,但我从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

我的大部分个人函数和加载的库都在rfunction中。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")')

这是我的。我总是使用主要的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"))
}

我的不太花哨:

# So the mac gui can find latex
Sys.setenv("PATH" = paste(Sys.getenv("PATH"),"/usr/texbin",sep=":"))


#Use last(x) instead of x[length(x)], works on matrices too
last <- function(x) { tail(x, n = 1) }


#For tikzDevice caching
options( tikzMetricsDictionary='/Users/cameron/.tikzMetricsDictionary' )

我在个人资料中设置了格子颜色主题。以下是我使用的另外两个调整方法:

# Display working directory in the titlebar
# Note: This causes demo(graphics) to fail
utils::setWindowTitle(base::getwd())
utils::assignInNamespace("setwd",function(dir)   {.Internal(setwd(dir));setWindowTitle(base::getwd())},"base")


# Don't print more than 1000 lines
options(max.print=2000)

下面是我的~ /。Rprofile,为Mac和Linux设计的。

这使得错误更容易被发现。

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是我在flux下使用的随机包。

此外,由于其他人提到了控制台宽度,以下是我如何做到这一点。

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中有它,然后我只是在必要时源它。

我喜欢保存我的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")))
}
}
options(stringsAsFactors=FALSE)

虽然我的. r配置文件中没有这个,因为它可能会破坏我的合作者的代码,但我希望它是默认的。为什么?

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

因子在你需要的时候很有用(比如在图中实现排序),但大多数时候都很麻烦。

以下是我的想法:

.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))
}

我讨厌每次都输入“头”、“摘要”、“名字”这些完整的单词,所以我用别名。

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

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

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

我有这个,更动态的技巧来使用全终端宽度,它试图从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也将使用全宽度。

我有一个环境变量R_USER_WORKSPACE,它指向包的顶部目录。在. rprofile中,我定义了一个函数devlib,它设置了工作目录(以便data()工作),并在R子目录中获取所有.R文件。它与上面Hadley的l()函数非常相似。

devlib <- function(pkg) {
setwd(file.path(Sys.getenv("R_USER_WORKSPACE", "."), deparse(substitute(pkg)), "dev"))
sapply(list.files("R", pattern=".r$", ignore.case=TRUE, full.names=TRUE), source)
invisible(NULL)
}


.First <- function() {
setwd(Sys.getenv("R_USER_WORKSPACE", "."))
options("repos" = c(CRAN = "http://mirrors.softliste.de/cran/", CRANextra="http://www.stats.ox.ac.uk/pub/RWin"))
}


.Last <- function() update.packages(ask="graphics")
setwd("C://path//to//my//prefered//working//directory")
library("ggplot2")
library("RMySQL")
library("foreign")
answer <- readline("What database would you like to connect to? ")
con <- dbConnect(MySQL(),user="root",password="mypass", dbname=answer)

我用mysql数据库做了很多工作,所以马上连接是天赐良机。我只希望有一种方法可以列出可用的数据库,这样我就不必记住所有不同的名称。

这是我的想法,包括上面提到的一些想法。

你可能需要看两件事:

  • .set.width() / w()将打印宽度更新为其中一个终端。不幸的是,我没有找到一种方法在终端调整大小上自动做到这一点- R文档提到这是由一些R解释器完成的。
  • 每次都会保存历史记录,并保存时间戳和工作目录

.set.width <- function() {
cols <- as.integer(Sys.getenv("COLUMNS"))
if (is.na(cols) || cols > 10000 || cols < 10)
options(width=100)
options(width=cols)
}


.First <- function() {
options(digits.secs=3)              # show sub-second time stamps
options(max.print=1000)             # do not print more than 1000 lines
options("report" = c(CRAN="http://cran.at.r-project.org"))
options(prompt="R> ", digits=4, show.signif.stars=FALSE)
}


# aliases
w <- .set.width


.Last <- function() {
if (!any(commandArgs()=='--no-readline') && interactive()){
timestamp(,prefix=paste("##------ [",getwd(),"] ",sep=""))
try(savehistory("~/.Rhistory"))
}
}
sink(file = 'R.log', split=T)


options(scipen=5)


.ls.objects <- function (pos = 1, pattern, order.by = "Size", decreasing=TRUE, head =     TRUE, n = 10) {
# based on postings by Petr Pikal and David Hinds to the r-help list in 2004
# modified by: Dirk Eddelbuettel (http://stackoverflow.com/questions/1358003/tricks-to-    manage-the-available-memory-in-an-r-session)
# I then gave it a few tweaks (show size as megabytes and use defaults that I like)
# a data frame of the objects and their associated storage needs.
napply <- function(names, fn) sapply(names, function(x)
fn(get(x, pos = pos)))
names <- ls(pos = pos, pattern = pattern)
obj.class <- napply(names, function(x) as.character(class(x))[1])
obj.mode <- napply(names, mode)
obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class)
obj.size <- napply(names, object.size) / 10^6 # megabytes
obj.dim <- t(napply(names, function(x)
as.numeric(dim(x))[1:2]))
vec <- is.na(obj.dim)[, 1] & (obj.type != "function")
obj.dim[vec, 1] <- napply(names, length)[vec]
out <- data.frame(obj.type, obj.size, obj.dim)
names(out) <- c("Type", "Size", "Rows", "Columns")
out <- out[order(out[[order.by]], decreasing=decreasing), ]
if (head)
out <- head(out, n)
out
}

我经常需要调用一系列调试调用,取消注释它们可能非常乏味。在所以社区的帮助下,我找到了以下解决方案,并将其插入到我的.Rprofile.site# BROWSER是我的Eclipse任务,以便我在任务视图窗口中有一个浏览器调用的概述。

# turn debugging on or off
# place "browser(expr = isTRUE(getOption("debug"))) # BROWSER" in your function
# and turn debugging on or off by bugon() or bugoff()
bugon <- function() options("debug" = TRUE)
bugoff <- function() options("debug" = FALSE) #pun intended

我使用下面的方法让cacheSweave(或pgfSweave)在RStudio中使用“Compile PDF”按钮:

library(cacheSweave)
assignInNamespace("RweaveLatex", cacheSweave::cacheSweaveDriver, "utils")

我的包括options(menu.graphics=FALSE),因为我喜欢禁用/抑制tcltk弹出的CRAN镜像选择R

rprofiles上的Stephen Turner的帖子有几个有用的别名和启动器函数。

我发现自己经常使用他的“ht”和“hh”。

#ht==headtail, i.e., show the first and last 10 items of an object
ht <- function(d) rbind(head(d,10),tail(d,10))


# Show the first 5 rows and first 5 columns of a data frame or matrix
hh <- function(d) d[1:5,1:5]

下面是我发现的两个方便使用窗口的函数。

第一个函数将__abc0转换为/

.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()))))
}

这是我的。没什么太创新的。为什么要选择特定的选项:

  • 我选择为stringsAsFactors设置默认值,因为我发现 每次我读取CSV时,都要将它作为参数传递。也就是说,当我在一台没有. r配置文件的计算机上使用在我常用计算机上编写的代码时,它已经给我带来了一些小烦恼。不过,我保留了它,因为它带来的麻烦与每天不设置它所带来的麻烦相比微不足道
  • 如果你没有在options(error=recover)之前加载utils包,当它被放置在interactive()块中时,它将无法找到recover。
  • 我使用.db而不是options(dropbox=...)作为我的dropbox设置,因为我一直在file.path中使用它,它节省了很多输入。前导.防止它与ls()一起出现。

话不多说:

if(interactive()) {
options(stringsAsFactors=FALSE)
options(max.print=50)
options(repos="http://cran.mirrors.hoobly.com")
}


.db <- "~/Dropbox"
# `=` <- function(...) stop("Assignment by = disabled, use <- instead")
options(BingMapsKey="blahblahblah") # Used by taRifx.geo::geocode()


.First <- function() {
if(interactive()) {
require(functional)
require(taRifx)
require(taRifx.geo)
require(ggplot2)
require(foreign)
require(R.utils)
require(stringr)
require(reshape2)
require(devtools)
require(codetools)
require(testthat)
require(utils)
options(error=recover)
}
}

让data.frames的显示有点像'head',只是不需要输入'head'

print.data.frame <- function(df) {
if (nrow(df) > 10) {
base::print.data.frame(head(df, 5))
cat("----\n")
base::print.data.frame(tail(df, 5))
} else {
base::print.data.frame(df)
}
}

(来自如何制作'头'自动应用到输出?)

我发现两个函数确实是必要的:首先,当我在几个函数上设置了debug(),并且我已经解决了错误,所以我想undebug()所有函数-而不是一个接一个。作为接受答案在这里添加的undebug_all()函数是最好的。

其次,当我定义了许多函数并正在寻找特定的变量名时,很难在ls()的所有结果中找到它,包括函数名。在这里发布的lsnofun()函数非常好。

下面是一个小片段,用于将表导出到乳胶。它将我编写的许多报告的所有列名更改为数学模式。我的. r配置文件的其余部分是相当标准的,上面已经介绍了大部分内容。

# Puts $dollar signs in front and behind all column names col_{sub} -> $col_{sub}$


amscols<-function(x){
colnames(x) <- paste("$", colnames(x), "$", sep = "")
x
}