Utenti esperti di R, cosa c'è nel tuo .profilo? [chiuso]


272

Ho sempre trovato utili e istruttivi i file del profilo di avvio di altre persone sulla lingua. Inoltre, mentre ho qualche personalizzazione per Bash e Vim , non ho nulla per R.

Ad esempio, una cosa che ho sempre desiderato sono colori diversi per l'input e l'output del testo in un terminale di finestra e forse anche l'evidenziazione della sintassi.


29
Purtroppo la domanda è chiusa, ma credo fermamente che la risposta giusta sia "niente". Invece di usare .Rprofile, suggerisco di mantenere uno script di inizializzazione ai massimi livelli di ogni progetto che lo invoca all'inizio di ogni script del progetto. Ciò mantiene il tuo lavoro riproducibile su altri utenti tramite il controllo del codice sorgente. Ma ci sono alcune risposte brillanti qui! Inserirò alcune di queste idee nei miei script di inizializzazione.
geneorama,

18
@geneorama - Buon commento ma qualificerei un po 'la tua risposta: .Rprofilenon dovrebbe includere alcun codice che cambi i risultati. Ciò che è possibile includere sono elementi che modificano l'aspetto di R (ad es. options("width"=160)) O il mirror CRAN predefinito (ad es options(repos = c(CRAN = "http://cran.rstudio.com")).). Tuttavia, non caricare pacchetti, modificare le opzioni predefinite delle funzioni utilizzate regolarmente, definire funzioni ecc. Il codice deve essere autonomo e riprodurre i risultati senza il .Rprofilefile specifico .
user2503795

@geneorama, dove dovrei mettere le funzioni personalizzate allora? Forse in un pacchetto / spazio dei nomi separato? È facile / possibile all'interno .Rprofile?
Aaron McDaid,

2
@ aaron-mcdaid First @ user2503795 è assolutamente giusto, .Rprofileè un posto adatto per apportare modifiche all'applicazione. In secondo luogo, la tua domanda dovrebbe essere una domanda SO separata. Cerco di utilizzare un modello simile a quello che abbiamo fatto nel nostro progetto di ispezione degli alimenti (vedere il layout del codice e i passaggi di inizializzazione nella parte superiore di ogni script).
geneorama,

Risposte:


96

Ecco il mio. Non ti aiuterà con la colorazione, ma ho capito da ESS ed 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

Non sono sicuro, ma penso che ora X11.options sia stato sostituito da windows.options. È vero?
Manuel Ramón,

Invece di crearlo re poi rminserirlo, potresti inserirlo in un local({ })blocco. Buona risposta, adoro la configurazione X11!
Aaron McDaid,

Sì, local({ ... })come mostrato in help(Startup)è quello che faccio di solito in questi giorni Rprofile.site. Non ho bisogno dell'hacking X11 da un po ':)
Dirk Eddelbuettel,

59
options(stringsAsFactors=FALSE)

Anche se in realtà non l'ho nel mio .Rprofile, perché potrebbe rompere il codice dei miei coautori, vorrei che fosse l'impostazione predefinita. Perché?

1) I vettori di caratteri usano meno memoria (ma solo a malapena);

2) Ancora più importante, eviteremmo problemi come:

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

e

> 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

I fattori sono ottimi quando ne hai bisogno (ad esempio implementando l'ordinamento nei grafici) ma un fastidio per la maggior parte del tempo.


Eduardo - Interessante, quali sono i vantaggi di non utilizzare i fattori?
medriscoll,

28
+1 Vorrei che questo fosse il valore predefinito in R.
Iteratore

5
Si noti che i vettori di caratteri sembrano utilizzare solo meno memoria (circa duecento byte) su sistemi a 32 bit. Sui sistemi a 64 bit, i fattori ne utilizzano considerevolmente meno. stat.ethz.ch/pipermail/r-help/2012-August/321919.html
Ari B. Friedman

+1 Grazie per aver segnalato alcuni dei principali problemi con i fattori. Il sistema di formattazione SAS presenta molti vantaggi rispetto a questo, imo. Quando si legge dal testo, stringheAsFactors è sempre impostato su false. Tuttavia, per il trasferimento dei dati, evito di leggere dal foglio di calcolo, ove possibile.
AdamO,

58

Odio scrivere ogni volta le parole complete 'testa', 'riassunto', 'nomi', quindi uso gli alias.

È possibile inserire alias nel file .Rprofile, ma è necessario utilizzare il percorso completo della funzione (ad esempio utils :: head), altrimenti non funzionerà.

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

EDIT: per rispondere alla tua domanda, puoi usare il pacchetto colorout per avere colori diversi nel terminale. Freddo! :-)


8
Penso nche mi morderebbe, personalmente, nella parte posteriore durante il debug.
Roman Luštrik,

2
Va bene per l'uso interattivo di R, ma questi non sono portatili - non metterli nel tuo codice (scritto)!
Vince il

25
Se si eliminano tutti gli oggetti nel proprio ambiente globale, verranno eliminati anche gli alias precedenti. Puoi evitarlo nascondendoli in un ambiente. .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
Ho provato questa grande idea, ma ho già usato s così ho fatto sum <- base::summary. Non è stata una grande idea.
Tom,

1
re colorout: "" "Questo pacchetto è stato archiviato: utilizzava punti di ingresso non API non consentiti dalle politiche CRAN." ""
isomorphismes

26

Ecco il mio. Uso sempre il repository cran principale e ho un codice per semplificare il codice del pacchetto in-sviluppo.

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

26

Mi piace salvare la cronologia dei miei comandi R e averla disponibile ogni volta che eseguo R:

Nella shell o .bashrc:

export R_HISTFILE=~/.Rhistory

in. Profilo:

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

23

Ecco due funzioni che trovo utili per lavorare con Windows.

Il primo converte la \s in /.

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

Il secondo apre la directory di lavoro in una nuova finestra di Explorer.

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

2
Questo .repathè così entrare nel mio .profilo.
Waldir Leoncio,

1
Ho scritto un componente aggiuntivo RStudio che includeva questa funzione. Basta copiare il percorso, fare clic su un menu da RStudio e il percorso convertito verrà inserito nella posizione del cursore. Questo dovrebbe salvare alcuni tasti.
dracodoc,

1
Odio molto il problema del percorso di Windows. Penso che potrei avere anche una soluzione migliore. Ho aggiunto uno snippet. quindi tutto quello che devo fare è digitare wpp quindi premere tab e il mio percorso copiato appare. Ecco il codice snippet wpp `r paste("\"", gsub("\\\\", "/", readClipboard()), "\"", sep = "")`
jamesguy0121,

18

Ho questo trucco, più dinamico, per usare l'intera larghezza del terminale, che prova a leggere dalla variabile d'ambiente COLUMNS (su 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)}
)

In questo modo R utilizzerà l'intera larghezza anche quando si ridimensiona la finestra del terminale.


1
Quando COLUMNSnon è impostato, puoi provare width = as.integer(system('tput cols',intern=TRUE)come backstop.
Shabbychef,

17

La maggior parte delle mie funzioni personali e delle librerie caricate si trovano nello 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")')

1
Heh, ho pensato di nominare una R GUI "Arrr" - questo è un modo molto più semplice per aggiungere un po 'di bontà alla pirateria.
Sharpie,

2
Ah grazie. È bello sapere che non sono l'unico a pensare al pirata quando si accende R. :-) Giuro che lo supererò uno di questi giorni.
Ars,

1
Spiega perché @Dirk si sia impegnato nella sua sceneggiatura ...
James,

1
"Avast Ye" è un pirata non standard . Preferisco che il mio pirata sia conforme agli standard. Inoltre, significa ~ "tieniti forte", quindi non avrebbe più senso all'inizio? : P
naught101,

2
In realtà ha perfettamente senso alla fine. Perché uscendo dal dominio r torniamo nell'ambiente minore circostante e dobbiamo nuovamente occuparci di fogli di calcolo e file di testo ad hoc.
kpierce8,

17

Ecco dal mio ~ / .profile , progettato per Mac e Linux.

Ciò semplifica la visualizzazione degli errori.

options(showWarnCalls=T, showErrorCalls=T)

Odio la scelta del menu CRAN, quindi imposta una buona.

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

Più storia!

Sys.setenv(R_HISTSIZE='100000')

Quello che segue è per l'esecuzione su Mac OSX dal terminale (che preferisco di gran lunga a R.app perché è più stabile e puoi organizzare il tuo lavoro per directory; assicurati anche di ottenere un buon ~ / .inputrc ). Per impostazione predefinita, ottieni un display X11, che non è così bello; questo invece fornisce un display al quarzo uguale alla GUI. La ifdichiarazione dovrebbe catturare il caso quando stai eseguendo R dal terminale su 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)

E precaricare alcune librerie,

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

dove util.r è una borsa casuale di cose che uso, sotto flusso.

Inoltre, poiché altre persone hanno menzionato la larghezza della console, ecco come lo faccio.

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)

Questo in realtà non è .Rprofileperché è necessario eseguirlo nuovamente ogni volta che si ridimensiona la finestra del terminale. Ce l'ho dentro util.rquindi lo fonte solo se necessario.


Se apro R in una finestra xterm (digitando "R") dovrebbe aprire una finestra simile a R gui? Non posso dire alcuna differenza aggiungendo questo .Rprofile alla mia directory home.
Richard Herron,

No. Quello che fa è, mantiene tutto nella console. Tuttavia, quando traccia le cose, utilizza un dispositivo di visualizzazione più intelligente rispetto al dispositivo di visualizzazione X11 predefinito.
Brendan OConnor,

Sento che questi script per il ridimensionamento delle finestre potrebbero essere utilmente un pacchetto. Sei d'accordo?
Isomorfismi

16

Ecco i miei:

.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
non dovresti pubblicare l'indirizzo del proxy del tuo istituto su un sito web pubblico.
dalloliogm,

13
dalloliogm, questo è un indirizzo IP privato (non pubblico). Esistono centinaia di migliaia di computer in tutto il mondo con lo stesso indirizzo IP esatto. Buona fortuna cercando di scoprire quale è il mio!
Alfred J Fazio

2
alfred, hai trovato un modo per definire le funzioni in .Rprofile (come hai fatto qui) senza che vengano mostrate quando fai un ls (), oltre a nominare con un '.' iniziale? Ho troppa confusione dalle funzioni che ho definito quando Is (). Grazie
Keith

4
@Keith assegnarli a un ambiente e collegare l'ambiente al percorso di ricerca, quindi ripulire. Se le funzioni si trovano in un file separato, è possibile eseguire il source direttamente nell'ambiente. Vedi ?new.env, ?assigne ?sys.source. Se non riesci a farlo funzionare, pubblica una nuova Q su SO e sono sicuro che otterrai Risposte.
Gavin Simpson,

Il tuo my.as.Datepotrebbe essere sostituito dal Lubridatepacchetto. Ho ragione?
Isomorfismi

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
}


10

Spesso ho una catena di chiamate di debug che devo chiamare e il loro commento può essere molto noioso. Con l'aiuto della comunità SO , ho scelto la seguente soluzione e l'ho inserita nella mia .Rprofile.site. # BROWSERè disponibile per le mie attività Eclipse in modo da avere una panoramica delle chiamate del browser nella finestra Visualizzazione attività.

# 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

9

Il mio non è troppo elegante:

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

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

Faccio molto lavoro dai database mysql, quindi il collegamento immediato è una manna dal cielo. Vorrei solo che esistesse un modo per elencare i database disponibili, quindi non avrei dovuto ricordare tutti i diversi nomi.


4
silly me dbGetQuery (con, "show database;")
Brandon Bertelsen,

8

Post di Stephen Turner su .Rprofiles ha diversi alias utili e funzioni di avvio.

Mi ritrovo a usare i suoi ht e hh spesso.

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

C'è un pacchetto chiamato BurStMisc che contiene una funzione chiamata cornerche fa lo stesso della tua hhfunzione e un po 'di più. ;)
Waldir Leoncio,

7

Ecco la mia, tra cui alcune delle idee menzionate.

Due cose che potresti voler guardare:

  • .set.width () / w () aggiorna la larghezza di stampa a quella del terminale. Sfortunatamente non ho trovato il modo di farlo automaticamente sul ridimensionamento del terminale - la documentazione R menziona che questo è fatto da alcuni interpreti R.
  • la cronologia viene salvata ogni volta insieme a un timestamp e alla directory di lavoro

.

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

7

Uso quanto segue per ottenere cacheSweave (o pgfSweave) per lavorare con il pulsante "Compila PDF" in RStudio:

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


7

Ecco il mio. Niente di troppo innovativo. Pensieri sul perché scelte particolari:

  • Sono andato con l'impostazione di un valore predefinito per stringsAsFactors perché trovo estremamente faticoso passarlo come argomento ogni volta che leggo un CSV. Detto questo, mi ha già causato una piccola seccatura quando uso il codice scritto sul mio solito computer su un computer che non aveva il mio .profilo. Lo sto tenendo, però, poiché i problemi che ha causato impallidiscono rispetto ai problemi che non hanno causato ogni giorno per causare.
  • Se non si carica utilsprima il pacchetto options(error=recover), non è possibile trovare il ripristino se inserito in un fileinteractive() blocco.
  • Ho usato .dbper le mie impostazioni di dropbox piuttosto che options(dropbox=...)perché lo uso sempre dentro file.pathe risparmia molta digitazione. Il protagonista gli .impedisce di apparire con ls().

Senza ulteriori indugi:

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

7

Ecco un piccolo frammento per l'uso dell'esportazione di tabelle in LaTeX . Cambia tutti i nomi delle colonne in modalità matematica per i molti rapporti che scrivo. Il resto del mio .Rprofile è piuttosto standard e principalmente coperto sopra.

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

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

5

Ho impostato il mio tema di colore reticolare nel mio profilo. Ecco altre due modifiche che uso:

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

1
Questa setwdsostituzione funzionerà meglio nella versione:utils::assignInNamespace("setwd",function(dir) {on.exit(setWindowTitle(base::getwd())); .Internal(setwd(dir))}, "base")
Marek,

5

Ho una variabile d'ambiente R_USER_WORKSPACE che punta alla directory superiore dei miei pacchetti. In .Rprofile definisco una funzione devlib che imposta la directory di lavoro (in modo che i dati () funzionino) e dia origine a tutti i file .R nella sottodirectory R. È abbastanza simile alla funzione l () di Hadley sopra.

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

5

Ho trovato davvero necessarie due funzioni: prima quando ho impostato debug()diverse funzioni e ho risolto il bug, quindi voglio undebug()tutte le funzioni, non una per una. La undebug_all()funzione aggiunta come risposta accettata qui è la migliore.

In secondo luogo, quando ho definito molte funzioni e sto cercando un nome di variabile specifico, è difficile trovarlo in tutti i risultati di the ls(), inclusi i nomi delle funzioni. La lsnofun()funzione pubblicata qui è davvero buona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.