Erfahrene R-Benutzer, was ist in Ihrem .R-Profil? [geschlossen]

271

Ich habe immer Startprofildateien anderer Leute gefunden, die sowohl nützlich als auch lehrreich in Bezug auf die Sprache sind. Während ich einige Anpassungen für Bash und Vim habe , habe ich nichts für R.

Zum Beispiel wollte ich immer unterschiedliche Farben für die Eingabe und Ausgabe von Text in einem Fensterterminal und möglicherweise sogar die Hervorhebung der Syntax.

Peter Mortensen
quelle
29
Leider ist die Frage geschlossen, aber ich denke fest daran, dass die richtige Antwort "nichts" ist. Anstatt .Rprofile zu verwenden, empfehle ich, ein Initialisierungsskript auf der obersten Ebene jedes Projekts zu belassen, das zu Beginn jedes Skripts in Ihrem Projekt aufgerufen wird. Dadurch bleibt Ihre Arbeit über die Quellcodeverwaltung für andere Benutzer reproduzierbar. Aber hier gibt es einige brillante Antworten! Ich werde einige dieser Ideen in meine eigenen Initialisierungsskripte einfügen.
Genorama
18
@geneorama - Guter Kommentar, aber ich würde Ihre Antwort ein wenig qualifizieren: Der .Rprofilesollte keinen Code enthalten, der die Ergebnisse ändert. Was Sie einschließen können, sind Dinge, die das Erscheinungsbild von R (z. B. options("width"=160)) oder des Standard-CRAN-Spiegels (z options(repos = c(CRAN = "http://cran.rstudio.com")). B. ) ändern . Laden Sie jedoch keine Pakete, ändern Sie nicht die Standardoptionen für regelmäßig verwendete Funktionen, definieren Sie Funktionen usw. Ihr Code sollte in sich geschlossen sein und die Ergebnisse ohne Ihre spezielle .RprofileDatei reproduzieren .
user2503795
@geneorama, wo soll ich dann benutzerdefinierte Funktionen platzieren? Vielleicht in einem separaten Paket / Namespace? Ist das innerhalb einfach / möglich .Rprofile?
Aaron McDaid
2
@ aaron-mcdaid First @ user2503795 ist absolut richtig, .Rprofileist ein geeigneter Ort, um Anwendungsänderungen vorzunehmen. Zweitens sollte Ihre Frage eine separate SO-Frage sein. Ich versuche, ein Muster zu verwenden, das dem in unserem Lebensmittelinspektionsprojekt ähnelt (siehe das Codelayout und die Initialisierungsschritte oben in jedem Skript).
Genorama

Antworten:

96

Hier ist mein. Es wird dir beim Färben nicht helfen, aber das bekomme ich von ESS und 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
Dirk Eddelbuettel
quelle
Ich bin nicht sicher, aber ich denke, dass jetzt X11.options durch windows.options ersetzt wurde. Ist das wahr?
Manuel Ramón
Anstatt es zu erstellen rund dann zu erstellen rm, können Sie es in einen local({ })Block einfügen. Gute Antwort, ich liebe die X11-Konfiguration!
Aaron McDaid
Ja, das, local({ ... })wie in gezeigt, help(Startup)ist das, was ich heutzutage normalerweise mache Rprofile.site. Ich habe den X11-Hack seit
einiger Zeit
59
options(stringsAsFactors=FALSE)

Obwohl ich das eigentlich nicht in meinem .Rprofile habe, weil es den Code meiner Mitautoren beschädigen könnte, wünschte ich, es wäre die Standardeinstellung. Warum?

1) Zeichenvektoren verbrauchen weniger Speicher (aber nur knapp);

2) Noch wichtiger ist, wir würden Probleme vermeiden wie:

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

und

> 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

Faktoren sind großartig, wenn Sie sie benötigen (z. B. Implementieren der Reihenfolge in Diagrammen), aber meistens ein Ärgernis.

Eduardo Leoni
quelle
Eduardo - Interessant, was sind die Vorteile, wenn man keine Faktoren verwendet?
Medriscoll
28
+1 Ich wünschte, dies wäre die Standardeinstellung in R.
Iterator
5
Beachten Sie, dass Zeichenvektoren auf 32-Bit-Systemen nur weniger Speicher (etwa zweihundert Byte) zu verbrauchen scheinen. Auf 64-Bit-Systemen verbrauchen Faktoren erheblich weniger. stat.ethz.ch/pipermail/r-help/2012-August/321919.html
Ari B. Friedman
+1 Vielen Dank, dass Sie auf einige der Hauptprobleme mit Faktoren hingewiesen haben. Das Formatierungssystem von SAS bietet imo viele Vorteile. Beim Lesen aus Text wird stringsAsFactors immer auf false gesetzt. Bei der Datenübertragung vermeide ich jedoch, wo immer möglich, das Lesen aus der Tabelle.
AdamO
58

Ich hasse es, jedes Mal die vollständigen Wörter "Kopf", "Zusammenfassung", "Namen" einzugeben, deshalb verwende ich Aliase.

Sie können Aliase in Ihre .Rprofile-Datei einfügen, müssen jedoch den vollständigen Pfad zur Funktion verwenden (z. B. utils :: head), da dies sonst nicht funktioniert.

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

BEARBEITEN: Um Ihre Frage zu beantworten, können Sie das Colorout- Paket verwenden, um verschiedene Farben im Terminal zu haben. Cool! :-)

Dalloliogm
quelle
8
Ich denke n, ich persönlich würde mich beim Debuggen im hinteren Bereich beißen.
Roman Luštrik
2
Gut für die interaktive Verwendung von R, aber diese sind nicht portabel - fügen Sie sie nicht in Ihren (geschriebenen) Code ein!
Vince
25
Wenn Sie jemals alle Objekte in Ihrer globalen Umgebung löschen, werden auch die oben genannten Aliase gelöscht. Sie können dies verhindern, indem Sie diese in einer Umgebung verstecken. .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
Ich habe diese großartige Idee ausprobiert, aber ich habe bereits s verwendet, also habe ich es getan sum <- base::summary. Das war keine so gute Idee.
Tom
1
re colorout: "" "Dieses Paket wurde archiviert: Es wurden Nicht-API-Einstiegspunkte verwendet, die von den CRAN-Richtlinien nicht zugelassen wurden." "
Isomorphismen
26

Hier ist meins. Ich verwende immer das Haupt-Cran-Repository und habe Code, um die Beschaffung von Code für Entwicklungspakete zu vereinfachen.

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

Ich mag es, meinen R-Befehlsverlauf zu speichern und ihn jedes Mal verfügbar zu haben, wenn ich R ausführe:

In der Shell oder .bashrc:

export R_HISTFILE=~/.Rhistory

in .Rprofil:

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

Hier sind zwei Funktionen, die ich für die Arbeit mit Windows nützlich finde.

Der erste konvertiert das \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')
 }

Der zweite öffnet das Arbeitsverzeichnis in einem neuen Explorer-Fenster.

getw <- function() {
    suppressWarnings(shell(paste("explorer",  gsub('/', '\\\\', getwd()))))
}
Tom
quelle
2
Das .repathkommt so in mein .Rprofil.
Waldir Leoncio
1
Ich habe ein RStudio-Add-In geschrieben , das diese Funktion enthält. Sie kopieren einfach den Pfad, klicken in RStudio auf ein Menü und der konvertierte Pfad wird in Ihre Cursorposition eingefügt. Dies sollte einige Tastenanschläge sparen.
Dracodoc
1
Ich hasse das Windows-Pfad-Problem so sehr. Ich denke, ich könnte noch eine bessere Lösung haben. Ich habe einen Ausschnitt hinzugefügt. Ich muss also nur wpp eingeben, dann die Tabulatortaste drücken und mein kopierter Pfad wird angezeigt. Hier ist der Code. snippet wpp `r paste("\"", gsub("\\\\", "/", readClipboard()), "\"", sep = "")`
Jamesguy0121
18

Ich habe diesen dynamischeren Trick, um die volle Terminalbreite zu verwenden, der versucht, aus der Umgebungsvariablen COLUMNS (unter Linux) zu lesen:

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

Auf diese Weise nutzt R die gesamte Breite, auch wenn Sie die Größe Ihres Terminalfensters ändern.

Branimir Dolicki
quelle
1
Wenn COLUMNSnicht eingestellt, können Sie es width = as.integer(system('tput cols',intern=TRUE)als Rücklaufsperre versuchen .
Shabbychef
17

Die meisten meiner persönlichen Funktionen und geladenen Bibliotheken befinden sich im Skript 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")')
kpierce8
quelle
1
Heh, ich habe darüber nachgedacht, eine R-GUI "Arrr" zu nennen - dies ist eine viel einfachere Möglichkeit, etwas Piratengüte hinzuzufügen.
Sharpie
2
Ah, Danke. Es ist gut zu wissen, dass ich nicht der einzige bin, der an Piraten denkt, wenn er R abfeuert :-) Ich schwöre, ich werde eines Tages darüber hinwegkommen.
Ars
1
Es erklärt, warum @Dirk seinen Haken in seinem Skript gesetzt hat ...
James
1
"Avast Ye" ist ein nicht standardmäßiger Pirat . Ich ziehe es vor, dass mein Pirat den Standards entspricht. Außerdem bedeutet es ~ "festhalten". Wäre es am Anfang nicht sinnvoller? : P
naught101
2
Eigentlich macht es am Ende durchaus Sinn. Denn beim Verlassen der Domäne r kehren wir in die kleinere Umgebung zurück und müssen uns erneut mit Tabellenkalkulationen und Ad-hoc-Textdateien befassen.
kpierce8
17

Hier ist mein ~ / .R-Profil , das für Mac und Linux entwickelt wurde.

Dadurch sind Fehler leichter zu erkennen.

options(showWarnCalls=T, showErrorCalls=T)

Ich hasse die CRAN-Menüauswahl, also stellen Sie eine gute ein.

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

Mehr Geschichte!

Sys.setenv(R_HISTSIZE='100000')

Das Folgende ist für die Ausführung unter Mac OSX vom Terminal aus vorgesehen (was ich R.app sehr vorziehe, da es stabiler ist und Sie Ihre Arbeit nach Verzeichnis organisieren können; stellen Sie außerdem sicher, dass Sie ein gutes ~ / .inputrc erhalten ). Standardmäßig erhalten Sie ein X11-Display, das nicht so gut aussieht. Dies ergibt stattdessen eine Quarzanzeige, die der GUI entspricht. Die ifAnweisung soll den Fall erfassen, wenn Sie R vom Terminal auf dem Mac ausführen.

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)

Und laden Sie ein paar Bibliotheken vor,

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

Dabei ist util.r eine zufällige Tüte mit Sachen, die ich benutze, unter Fluss.

Da andere Leute die Konsolenbreite erwähnten, mache ich das auch so.

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)

Dies ist eigentlich nicht der .RprofileFall, da Sie es jedes Mal neu ausführen müssen, wenn Sie die Größe des Terminalfensters ändern. Ich habe es in util.rdann beschaffe ich es einfach nach Bedarf.

Brendan OConnor
quelle
Wenn ich R in einem xterm-Fenster öffne (durch Eingabe von "R"), sollte es ein R-gui-ähnliches Fenster öffnen? Ich kann keinen Unterschied feststellen, indem ich dieses Profil zu meinem Home-Verzeichnis hinzufüge.
Richard Herron
Nein, das hält alles in der Konsole. Wenn Sie jedoch Dinge zeichnen, wird ein intelligenteres Anzeigegerät als das Standard-X11-Anzeigegerät verwendet.
Brendan OConnor
Ich bin der Meinung, dass diese Skripte zur Größenänderung von Fenstern sinnvollerweise ein Paket sein könnten. Sind Sie einverstanden?
Isomorphismen
16

Hier sind meine:

.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))
}
Alfred J Fazio
quelle
1
Sie sollten die Adresse des Vertreters Ihrer Institution nicht auf einer öffentlichen Website veröffentlichen.
Dalloliogm
13
dalloliogm, dies ist eine private (nicht öffentliche) IP-Adresse. Es gibt Hunderttausende von Computern auf der ganzen Welt mit genau derselben IP-Adresse. Viel Glück beim Herausfinden, welches mir gehört!
Alfred J Fazio
2
Alfred, hast du einen Weg gefunden, Funktionen in .Rprofile (wie hier) zu definieren, ohne dass sie beim Ausführen eines ls () angezeigt werden, abgesehen von der Benennung mit einem Anfangsbuchstaben '.'? Ich habe zu viel Unordnung von den Funktionen, die ich definiert habe, als ich ls (). Vielen Dank
Keith
4
@Keith weist sie einer Umgebung zu, hängt die Umgebung an den Suchpfad an und bereinigt dann. Wenn sich die Funktionen in einer separaten Datei befinden, können Sie sie direkt in die Umgebung übertragen. Siehe ?new.env, ?assignund ?sys.source. Wenn Sie es nicht zum Laufen bringen können, posten Sie ein neues Q auf SO und ich bin sicher, dass Sie Antworten erhalten.
Gavin Simpson
my.as.DateMöglicherweise wird Ihr LubridatePaket ersetzt. Habe ich recht?
Isomorphismen
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
}
Patrick McCann
quelle
11

Lassen Sie data.frames etwas wie 'head' anzeigen, nur ohne 'head' eingeben zu müssen.

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

(Von Wie wird 'Kopf' automatisch auf die Ausgabe angewendet? )

Hugh Perkins
quelle
10

Ich habe oft eine Reihe von Debug-Aufrufen, die ich aufrufen muss, und das Kommentieren kann sehr langwierig sein. Mit Hilfe der SO-Community habe ich mich für die folgende Lösung entschieden und diese in meine eingefügt .Rprofile.site. # BROWSERist für meine Eclipse-Aufgaben vorhanden, damit ich im Fenster "Aufgabenansicht" einen Überblick über die Browseraufrufe habe.

# 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
Roman Luštrik
quelle
9

Meins ist nicht besonders schick:

# 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' )
cameron.bracken
quelle
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)

Ich arbeite viel in MySQL-Datenbanken, daher ist es ein Glücksfall, sofort eine Verbindung herzustellen. Ich wünschte nur, es gäbe eine Möglichkeit, die verfügbaren Datenbanken aufzulisten, damit ich mich nicht an all die verschiedenen Namen erinnern müsste.

Brandon Bertelsen
quelle
4
dumm mich dbGetQuery (con, "show database ';")
Brandon Bertelsen
8

Stephen Turners Beitrag zu .Rprofiles enthält mehrere nützliche Aliase und Starterfunktionen.

Ich benutze sein ht und hh oft.

#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]
Ram Narasimhan
quelle
Es gibt ein Paket namens BurStMisc , das eine aufgerufene Funktion cornerenthält, die dasselbe tut wie Ihre hhFunktion und ein bisschen mehr. ;)
Waldir Leoncio
7

Hier ist meine, einschließlich einiger der genannten Ideen.

Zwei Dinge, die Sie vielleicht betrachten möchten:

  • .set.width () / w () aktualisiert Ihre Druckbreite auf die des Terminals. Leider habe ich beim Ändern der Terminalgröße keine Möglichkeit gefunden, dies automatisch zu tun. In der R-Dokumentation wird erwähnt, dass dies von einigen R-Interpreten durchgeführt wird.
  • Der Verlauf wird jedes Mal zusammen mit einem Zeitstempel und dem Arbeitsverzeichnis gespeichert

.

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

Ich verwende Folgendes, um cacheSweave (oder pgfSweave) dazu zu bringen, mit der Schaltfläche "PDF kompilieren" in RStudio zu arbeiten:

library(cacheSweave)
assignInNamespace("RweaveLatex", cacheSweave::cacheSweaveDriver, "utils")
ROLO
quelle
7

Hier ist meins. Nichts zu innovativ. Gedanken darüber, warum bestimmte Entscheidungen:

  • Ich habe mich für die Festlegung eines Standardwerts entschieden, stringsAsFactorsda es für mich äußerst anstrengend ist, ihn jedes Mal als Argument zu übergeben, wenn ich eine CSV einlese. Das heißt, es hat mich bereits ein wenig verärgert, wenn ich Code verwendet habe, der auf meinem normalen Computer auf einem Computer geschrieben wurde hatte mein .Rprofil nicht. Ich behalte es jedoch bei, da die Probleme, die es verursacht hat, im Vergleich zu den Problemen, die es nicht jeden Tag verursacht hat, verblasst sind.
  • Wenn Sie das utilsPaket zuvor nicht geladen haben options(error=recover), kann es keine Wiederherstellung finden, wenn es in einem interactive()Block platziert wird.
  • Ich habe .dbmeine Dropbox-Einstellung verwendet, anstatt options(dropbox=...)sie ständig im Inneren zu verwenden, file.pathund sie spart viel Tipparbeit. Die Führung verhindert, dass .es mit erscheint ls().

Ohne weiteres:

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)
    }
}
Ari B. Friedman
quelle
7

Hier ist ein kleiner Ausschnitt zum Exportieren von Tabellen nach LaTeX . Für die vielen Berichte, die ich schreibe, werden alle Spaltennamen in den Mathematikmodus geändert. Der Rest meines .R-Profils ist ziemlich normal und wird oben größtenteils behandelt.

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

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

Ich habe mein Gitterfarbthema in meinem Profil festgelegt. Hier sind zwei weitere Verbesserungen, die ich verwende:

# 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)
Kevin Wright
quelle
1
Dieser setwdErsatz wird besser funktionieren in Version:utils::assignInNamespace("setwd",function(dir) {on.exit(setWindowTitle(base::getwd())); .Internal(setwd(dir))}, "base")
Marek
5

Ich habe eine Umgebungsvariable R_USER_WORKSPACE, die auf das oberste Verzeichnis meiner Pakete verweist. In .Rprofile definiere ich eine Funktion devlib, die das Arbeitsverzeichnis festlegt (damit data () funktioniert) und alle .R-Dateien im R-Unterverzeichnis als Quelle bereitstellt. Es ist der obigen l () -Funktion von Hadley ziemlich ähnlich.

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")
Karsten W.
quelle
5

Ich fand zwei Funktionen wirklich notwendig: Erstens, wenn ich debug()mehrere Funktionen eingestellt und den Fehler behoben habe, möchte ich undebug()alle Funktionen - nicht eine nach der anderen. Die undebug_all()Funktion hinzugefügt , wie die akzeptierte Antwort hier ist das Beste.

Zweitens, wenn ich viele Funktionen definiert habe und nach einem bestimmten Variablennamen suche, ist es schwierig, ihn in allen Ergebnissen der ls(), einschließlich der Funktionsnamen, zu finden. Die hierlsnofun() gepostete Funktion ist wirklich gut.

Ali
quelle