titulo longitud keywords etiqueta description descripcion crear como r terminal customization rprofile

longitud - Usuarios expertos de R, ¿qué hay en tu perfil.R?



meta title y meta descripcion (24)

Siempre he encontrado archivos de perfil de inicio de otras personas útiles e instructivos sobre el idioma. Por otra parte, aunque tengo algunas personalizaciones para Bash y Vim , no tengo nada para R.

Por ejemplo, una cosa que siempre quise es colores diferentes para el texto de entrada y salida en un terminal de ventana, y tal vez incluso el resaltado de sintaxis.


A menudo tengo una cadena de llamadas de depuración a las que necesito llamar y el comentarlas puede ser muy tedioso. Con la ayuda de la comunidad SO , .Rprofile.site por la siguiente solución y la .Rprofile.site en mi .Rprofile.site . # BROWSER está allí para mis tareas de Eclipse, de modo que tenga una visión general de las llamadas del navegador en la ventana Vista de tareas.

# 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


Aquí está de mi ~/.Rprofile , diseñado para Mac y Linux.

Esto hace que los errores sean más fáciles de ver.

options(showWarnCalls=T, showErrorCalls=T)

Odio la opción de menú de CRAN, así que configura una buena.

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

¡Más historia!

Sys.setenv(R_HISTSIZE=''100000'')

Lo siguiente es para ejecutar en Mac OSX desde la terminal (que prefiero mucho a R.app porque es más estable, y puede organizar su trabajo por directorio; también asegúrese de obtener un buen ~/.inputrc ). Por defecto, obtienes una pantalla X11, que no se ve tan bien; esto, en cambio, proporciona una pantalla de cuarzo igual a la GUI. Se supone que la instrucción if detecta el caso cuando ejecutas R desde el terminal en 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)

Y precarga algunas bibliotecas,

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

donde util.r es una bolsa aleatoria de cosas que uso, bajo flujo.

Además, como otras personas mencionaron el ancho de la consola, así es como lo hago.

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)

En realidad, esto no está en .Rprofile porque debe volver a ejecutarlo cada vez que cambie el tamaño de la ventana del terminal. Lo tengo en util.r luego lo util.r según sea necesario.


Aquí está el mío. Nada demasiado innovador. Reflexiones sobre por qué elecciones particulares:

  • Fui con el establecimiento de un valor predeterminado para stringsAsFactors porque me resulta extremadamente agotador pasarlo como argumento cada vez que leo un CSV. Dicho esto, ya me causó una pequeña molestia al usar el código escrito en mi computadora habitual en una computadora el cual no tenia mi perfil. Sin embargo, lo estoy guardando, ya que los problemas que ha causado palidecen en comparación con los problemas que no se tienen para solucionar todos los días.
  • Si no carga el paquete utils antes de las options(error=recover) , no puede encontrar la recuperación cuando se coloca dentro de un bloque interactive() .
  • .db para mi configuración de .db en lugar de las options(dropbox=...) porque lo uso todo el tiempo dentro de file.path y me ahorra mucho la escritura. El líder . evita que aparezca con ls() .

Sin más preámbulos:

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


Aquí está el mío. Siempre uso el repositorio principal de cran, y tengo un código para facilitar la fuente del código del paquete en desarrollo.

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


Aquí está la mía, incluyendo algunas de las ideas mencionadas.

Dos cosas que podrías querer mirar:

  • .set.width () / w () actualiza su ancho de impresión al del terminal. Desafortunadamente, no encontré una forma de hacer esto automáticamente en el cambio de tamaño de terminal. La documentación de R menciona que esto lo hacen algunos intérpretes de R.
  • el historial se guarda cada vez junto con una marca de tiempo y el directorio de trabajo

.

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


Aquí están los míos:

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


Aquí esta el mio. No te ayudará con el color, pero lo obtengo de ESS y 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


Aquí hay dos funciones que me parecen útiles para trabajar con Windows.

El primero convierte los / s a / .

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

El segundo abre el directorio de trabajo en una nueva ventana del explorador.

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


Aquí hay un pequeño fragmento de código para exportar tablas a LaTeX . Cambia todos los nombres de columna al modo matemático para los muchos informes que escribo. El resto de mi perfil de .profile es bastante estándar y está cubierto en su mayoría arriba.

# Puts $dollar signs in front and behind all column names col_{sub} -> $col_{sub}$ amscols<-function(x){ colnames(x) <- paste("$", colnames(x), "$", sep = "") x }



El mío no es demasiado lujoso

# 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'' )


Encontré dos funciones realmente necesarias: primero cuando establezco debug() en varias funciones y resolví el error, por lo que quiero undebug() todas las funciones, no una por una. La función undebug_all() agregada como la respuesta aceptada here es la mejor.

Segundo, cuando he definido muchas funciones y busco un nombre de variable específico, es difícil encontrarlo dentro de todos los resultados de ls() , incluidos los nombres de las funciones. La función lsnofun() publicada here es realmente buena.


Haga que los cuadros de datos se muestren algo así como ''head'', solo que sin tener que escribir ''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) } }

( ¿Cómo hacer que ''cabeza'' se aplique automáticamente a la salida? )


La mayoría de mis funciones personales y las bibliotecas cargadas están en el script 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")'')


Me gusta guardar mi historial de comandos de R y tenerlo disponible cada vez que ejecuto R:

En la shell o .bashrc:

export R_HISTFILE=~/.Rhistory

en. perfil de

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


Odio escribir las palabras completas ''cabeza'', ''resumen'', ''nombres'' todas las veces, así que uso alias.

Puede poner alias en su archivo .Rprofile, pero tiene que usar la ruta completa a la función (por ejemplo, utils :: head) de lo contrario no funcionará.

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

EDITAR: para responder a su pregunta, puede usar el paquete de colorout para tener diferentes colores en el terminal. ¡Guay! :-)


Puse mi tema de color de celosía en mi perfil. Aquí hay otros dos ajustes que utilizo:

# 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)


Tengo este truco más dinámico para usar el ancho de terminal completo, que intenta leer desde la variable de entorno COLUMNS (en 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)} )

De esta manera, R utilizará el ancho completo incluso cuando redimensione la ventana de su terminal.


Tengo una variable de entorno R_USER_WORKSPACE que apunta al directorio superior de mis paquetes. En .Rprofile defino una función devlib que establece el directorio de trabajo (para que funcione data ()) y genera todos los archivos .R en el subdirectorio R. Es bastante similar a la función l () de Hadley anterior.

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")


Uso lo siguiente para obtener cacheSweave (o pgfSweave) para trabajar con el botón "Compilar PDF" en RStudio:

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


La publicación de Stephen Turner en .Rprofiles tiene varios alias y funciones de inicio útiles.

Me encuentro usando su ht y hh a menudo.

#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]


options(stringsAsFactors=FALSE)

Aunque en realidad no tengo eso en mi perfil de perfil, ya que podría romper el código de mis coautores, me gustaría que fuera el predeterminado. ¿Por qué?

1) Los vectores de caracteres usan menos memoria (pero apenas);

2) Más importante aún, evitaríamos problemas como:

> 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"

y

> 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

Los factores son excelentes cuando los necesita (p. Ej., La implementación de pedidos en gráficos), pero es una molestia la mayor parte del tiempo.


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)

Trabajo mucho con las bases de datos mysql, así que conectarme de inmediato es una bendición. Ojalá hubiera una forma de enumerar las bases de datos disponibles para no tener que recordar todos los nombres diferentes.


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://.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 }