可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have always found startup profile files of other people both useful and instructive about the language. Moreover, while I have some customization for Bash and Vim, I have nothing for R.
For example, one thing I always wanted is different colors for input and output text in a window terminal, and maybe even syntax highlighting.
回答1:
Here is mine. It won\'t help you with the coloring but I get that from ESS and 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
回答2:
I hate to type the full words \'head\', \'summary\', \'names\' every time, so I use aliases.
You can put aliases into your .Rprofile file, but you have to use the full path to the function (e.g. utils::head) otherwise it won\'t work.
# aliases
s <- base::summary
h <- utils::head
n <- base::names
EDIT: to answer your question, you can use the colorout package to have different colors in the terminal. Cool! :-)
回答3:
options(stringsAsFactors=FALSE)
Although I don\'t actually have that in my .Rprofile, because it might breaks my coauthors\' code, I wish it was the default. Why?
1) Character vectors use less memory (but only barely);
2) More importantly, we would avoid problems such as:
> 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\"
and
> 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
Factors are great when you need them (e.g. implementing ordering in graphs) but a nuisance most of the time.
回答4:
Here\'s mine. I always use the main cran repository, and have code to make it easy to source in-development package code.
.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\"))
}
回答5:
I like saving my R command history and having it available each time I run R:
In the shell or .bashrc:
export R_HISTFILE=~/.Rhistory
in .Rprofile:
.Last <- function() {
if (!any(commandArgs()==\'--no-readline\') && interactive()){
require(utils)
try(savehistory(Sys.getenv(\"R_HISTFILE\")))
}
}
回答6:
Here are two functions I find handy for working with windows.
The first converts the \\
s to /
.
.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\')
}
The second opens the working directory in a new explorer window.
getw <- function() {
suppressWarnings(shell(paste(\"explorer\", gsub(\'/\', \'\\\\\\\\\', getwd()))))
}
回答7:
I\'ve got this, more dynamic trick to use full terminal width, which tries to read from the COLUMNS environment variable (on 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)}
)
This way R will use the full width even as you resize your terminal window.
回答8:
Most of my personal functions and loaded libraries are in the Rfunctions.r script
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\")\')
回答9:
Here\'s from my ~/.Rprofile, designed for Mac and Linux.
These make errors easier to see.
options(showWarnCalls=T, showErrorCalls=T)
I hate the CRAN menu choice, so set to a good one.
options(repos=c(\"http://cran.cnr.Berkeley.edu\",\"http://cran.stat.ucla.edu\"))
More history!
Sys.setenv(R_HISTSIZE=\'100000\')
The following is for running on Mac OSX from the terminal (which I greatly prefer to R.app because it\'s more stable, and you can organize your work by directory; also make sure to get a good ~/.inputrc). By default, you get an X11 display, which doesn\'t look as nice; this instead gives a quartz display same as the GUI. The if
statement is supposed to catch the case when you\'re running R from the terminal on Mac.
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)
And preload a few libraries,
library(plyr)
library(stringr)
library(RColorBrewer)
if (file.exists(\"~/util.r\")) {
source(\"~/util.r\")
}
where util.r is a random bag of stuff I use, under flux.
Also, since other people were mentioning console width, here\'s how I do it.
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)
This actually isn\'t in .Rprofile
because you have to re-run it every time you resize the terminal window. I have it in util.r
then I just source it as necessary.
回答10:
Here are mine:
.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))
}
回答11:
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
}
回答12:
Make data.frames display somewhat like \'head\', only without having to type \'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)
}
}
(From How to make 'head' be applied automatically to output? )
回答13:
I often have a chain of debug calls I need to call and uncommenting them can be very tedious. With the help of the SO community, I went for the following solution and inserted this into my .Rprofile.site
. # BROWSER
is there for my Eclipse Tasks so that I have an overview of browser calls in the Task View window.
# 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
回答14:
Mine is not too fancy:
# 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\' )
回答15:
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)
I do a lot of work from mysql databases, so connecting right away is a godsend. I only wish there was a way of listing the avaialble databases so I wouldn\'t have to remember all the different names.
回答16:
Stephen Turner\'s post on .Rprofiles has several useful aliases and starter functions.
I find myself using his ht and hh often.
#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]
回答17:
I use the following to get cacheSweave (or pgfSweave) to work with the \"Compile PDF\" button in RStudio:
library(cacheSweave)
assignInNamespace(\"RweaveLatex\", cacheSweave::cacheSweaveDriver, \"utils\")
回答18:
Mine includes options(menu.graphics=FALSE)
because I like to Disable/suppress tcltk popup for CRAN mirror selection in R.
回答19:
Here\'s mine. Nothing too innovative. Thoughts on why particular choices:
- I went with setting a default for
stringsAsFactors
because I find
it extremely draining to pass it as an argument each time I read a CSV in. That said, it has already caused me some minor vexation when using code written on my usual computer on a computer which did not have my .Rprofile. I\'m keeping it, though, as the troubles it has caused pale in comparison to the troubles not having it set everyday used to cause.
- If you don\'t load the
utils
package before options(error=recover)
, it cannot find recover when placed inside an interactive()
block.
- I used
.db
for my dropbox setting rather than options(dropbox=...)
because I use it all the time inside file.path
and it saves much typing. The leading .
keeps it from appearing with ls()
.
Without further ado:
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)
}
}
回答20:
Here\'s a little snippet for use exporting tables to LaTeX. It changes all the column names to math mode for the many reports I write. The rest of my .Rprofile is pretty standard and mostly covered above.
# Puts $dollar signs in front and behind all column names col_{sub} -> $col_{sub}$
amscols<-function(x){
colnames(x) <- paste(\"$\", colnames(x), \"$\", sep = \"\")
x
}
回答21:
Here\'s mine, including some of the mentioned ideas.
Two things you might want to look at:
- .set.width() / w() update your print width to the one of the terminal. Unfortunately I did not find a way to do this automatically on terminal resize - R documentation mentions this is done by some R interpreters.
- history is saved every time together with a timestamp and the working directory
.
.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\"))
}
}
回答22:
I set my lattice color theme in my profile. Here are two other tweaks I use:
# 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)
回答23:
I have an environment variable R_USER_WORKSPACE which points to the top directory of my packages. In .Rprofile I define a function devlib which sets the working directory (so that data() works) and sources all .R files in the R subdirectory. It is quite similar to Hadley\'s l() function above.
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\")
回答24:
I found two functions really necessary: First when I have set debug()
on several functions and I have resolved the bug, so I want to undebug()
all functions - not one by one. The undebug_all()
function added as the accepted answer here is the best.
Second, when I have defined many functions and I am looking for a specific variable name, it\'s hard to find it within all results of the the ls()
, including the function names. The lsnofun()
function posted here is really good.