2014-09-27 4 views
5

Ich kopiere Code aus dem Terminal, um hier zu posten. Es ist in folgender Form:So konvertieren Sie Code in besser lesbare Form in R

> ddf2 = ddf[ddf$stone_ny>'stone',] # this is first command 
> ddf2[!duplicated(ddf2$deltnr),] # second command 
    deltnr us stone_ny stone_mobility  
4 1536 63 stone   mobile 
10 1336 62 stone   mobile 

Erste 2 Zeilen sind Befehle während die nächsten 3 Zeilen ausgegeben werden. Dies kann jedoch nicht von hier zurück in R-Terminal kopiert werden, da die Befehle mit '>' beginnen. Wie kann ich dies umwandeln in:

So dass es von hier zum Kopieren geeignet werden.

Ich habe versucht:

text 
[1] "> ddf2 = ddf[ddf$stone_ny>'stone',] # this is first command\n> ddf2[!duplicated(ddf2$deltnr),] # second command\n deltnr us stone_ny stone_mobility  \n4 1536 63 stone   mobile \n10 1336 62 stone   mobile " 


text2 = gsub('\n','#',text) 
text2 = gsub('#>','\n',text2) 
text2 = gsub('#','\n#',text2) 
text2 
[1] "> ddf2 = ddf[ddf$stone_ny>'stone',] \n# this is first command\n 
ddf2[!duplicated(ddf2$deltnr),] \n# second command\n# deltnr us stone_ny stone_mobility  \n#4 1536 63 stone   mobile \n#10 1336 62 stone   mobile " 

Aber es ist nicht an das Terminal geklebt bekommen kann.

+0

Wenn Sie RStudio verwenden, können Sie Ihren Code einfach in den Skripteditorbereich schreiben und die Ergebnisse mit Strg + Alt + C auskommentieren. – A5C1D2H2I1M1N2O1R2T1

+0

Strg + Alt + C funktioniert nicht in meinem System (R studio 0.98. 501 auf Linux Debian stable) – rnso

+0

auch, möchten Sie vielleicht einen Blick auf 'Sublime Text 3' +' Enhanced R-Paket' (für ST3).Mehrzeilenbearbeitung ist unglaublich –

Antwort

7

Ich habe auf eine Gelegenheit gewartet, diese Funktion zu teilen, die ich in meiner Datei .Rprofile aufbewahre. Obwohl es nicht genau Ihre Frage beantworten kann, fühle ich, dass es etwas erreicht, was sehr nahe an dem ist, wonach Sie suchen. So können Sie einige Ideen bekommen, indem Sie auf den Code schauen. Andere mögen es nützlich finden, so wie es ist. Die Funktion:

SO <- function(script.file = '~/.active-rstudio-document') { 

    # run the code and store the output in a character vector 
    tmp <- tempfile() 
    capture.output(
     source(script.file, echo = TRUE, 
          prompt.echo = "> ", 
          continue.echo = "+ "), file = tmp) 
    out <- readLines(tmp) 

    # identify lines that are comments, code, results 
    idx.comments <- grep("^> [#]{2}", out) 
    idx.code  <- grep("^[>+] ", out) 
    idx.blank <- grep("^[[:space:]]*$", out) 
    idx.results <- setdiff(seq_along(out), 
          c(idx.comments, idx.code, idx.blank)) 
    # reformat 
    out[idx.comments] <- sub("^> [#]{2} ", "", out[idx.comments]) 
    out[idx.code]  <- sub("^[>+] ", " ", out[idx.code]) 
    out[idx.results] <- sub("^", " # ", out[idx.results]) 

    # output 
    cat(out, sep = "\n", file = stdout()) 
} 

Diese SO Funktion ist es, was mir erlaubt, schnell auf meine Antworten auf Fragen zu diesem sehr Website formatiert, Stackoverflow. Mein Workflow ist wie folgt:

1) In RStudio, schreibe meine Antwort in einem unbenannten Skript (das ist der obere linke Quadrant). Zum Beispiel:

## This is super easy, you can do 

set.seed(123) 
# initialize x 
x <- 0 
while(x < 0.5) { 
    print(x) 
    # update x 
    x <- runif(1) 
} 

## And voila. 

2) Klicken Sie im oberen Bereich auf die Schaltfläche "Quelle". Es wird den Code in der Konsole ausführen, was nicht wirklich das ist, was wir wollen: Stattdessen wird es den Nebeneffekt haben, den Code in der Standarddatei '~/.active-rstudio-document' zu speichern.

3) Run SO() von der Konsole (linken unteren Quadranten), die den Code (wieder ...) aus der gespeicherten Datei beziehen wird, erfassen die Ausgabe und drucken Sie es in einem SO-freundliches Format:

This is super easy, you can do 

    set.seed(123) 
    # initialize x 
    x <- 0 
    while(x < 0.5) { 
     print(x) 
     # update x 
     x <- runif(1) 
    } 
    # [1] 0 
    # [1] 0.2875775 

And voila. 

4) Kopieren-Einfügen in stackoverflow und fertig.

Hinweis: Bei Code, der eine Weile dauert, können Sie vermeiden, ihn zweimal auszuführen, indem Sie das Skript in einer Datei speichern (z. B. "xyz.R"), anstatt auf die Schaltfläche "Quelle" zu klicken. Führen Sie dann SO("xyz.R").

+0

Das ist wirklich cool, danke fürs Teilen. Wenn ich es aber ausführe, bekomme ich Kommentarzeichen vor 'print (x)' ganz nach unten bis '[1] 0.2875775' Muss ich etwas anpassen? –

+0

Hmm. Verwenden Sie die Standardaufforderungen ('"> "' und '" + "')? Sie können dies überprüfen, indem Sie 'getOption (" prompt ")' und 'getOption (" continue ")' ausführen. Meine Funktion kann durch Hinzufügen von 'prompt.echo ="> "' und 'continue.prompt =" + "' zum 'source()' Aufruf robuster gemacht werden. Ich werde das trotzdem hinzufügen. – flodel

+0

Nun, wie Sie sehen, wenn ich neu formatiere, nehme ich an, die Aufforderung ist ">". Entweder kann ich 'source' mit dem Standard' prompt.echo = getOption ("prompt") aufrufen 'aber ich muss' getOption ("prompt") 'in meinem Regex verwenden, oder ich zwinge' '' '' by Hinzufügen von 'prompt.echo ="> "' zum Quellaufruf. Ich habe mich für Letzteres entschieden, sehe meine Bearbeitung. – flodel

2

Sie könnten versuchen cat mit einem ifelse Zustand.

cat(ifelse(substr(s <- strsplit(text, "\n")[[1]], 1, 1) %in% c("_", 0:9, " "), 
      paste0("# ", s), 
      gsub("[>] ", "", s)), 
    sep = "\n") 

die

ddf2 = ddf[ddf$stone_ny>'stone',] # this is first command 
ddf2[!duplicated(ddf2$deltnr),] # second command 
# deltnr us stone_ny stone_mobility  
# 4 1536 63 stone   mobile 
# 10 1336 62 stone   mobile 

Die "_" und 0:9 in Ergebnisse sind da drin, weil eine der Regeln in R ist, dass eine Funktion nicht mit einem _ oder einer Ziffer beginnen kann. Sie können es an Ihre Bedürfnisse anpassen.

+0

Es funktioniert. Ich werde es mit anderem Text versuchen, der auch vom Terminal kopiert wurde. – rnso

+0

@rnso - 'cat' hat auch ein' labels' und ein 'fill' Argument, das sich als nützlich erweisen könnte. zum Beispiel 'cat (einfügen (Buchstaben, 10 * 1:15), fill = TRUE, labels = paste0 (" {", 1:15,"}: "))' –

+0

Danke für den Tipp. – rnso

Verwandte Themen