R Language
Zeichenfolgen lesen und schreiben
Suche…
Bemerkungen
Verwandte Dokumente:
Zeichenketten drucken und anzeigen
R verfügt über mehrere integrierte Funktionen, die zum Drucken oder Anzeigen von Informationen verwendet werden können, aber print
und cat
sind die grundlegendsten Funktionen. Da R eine interpretierte Sprache ist , können Sie diese direkt in der R-Konsole ausprobieren:
print("Hello World")
#[1] "Hello World"
cat("Hello World\n")
#Hello World
Beachten Sie den Unterschied in Eingang und Ausgang für die beiden Funktionen. (Hinweis: Der Wert von x
keine Anführungszeichen, die mit x <- "Hello World"
. Sie werden bei der Ausgabe durch print
hinzugefügt.)
cat
einen oder mehrere Zeichenvektoren als Argumente und gibt sie an die Konsole aus. Wenn der Zeichenvektor eine Länge von mehr als 1 hat, werden die Argumente standardmäßig durch ein Leerzeichen getrennt:
cat(c("hello", "world", "\n"))
#hello world
Ohne das neue Zeilenzeichen ( \n
) wäre die Ausgabe:
cat("Hello World")
#Hello World>
Die Eingabeaufforderung für den nächsten Befehl erscheint unmittelbar nach der Ausgabe. (Einige Konsolen, wie die von RStudio, fügen automatisch eine Newline an Zeichenfolgen an, die nicht mit einer Newline enden.)
print
ist ein Beispiel für eine "generische" Funktion. Dies bedeutet, dass die Klasse des ersten übergebenen Arguments erkannt wird und eine klassenspezifische Methode zur Ausgabe verwendet wird. Bei einem Zeichenvektor wie "Hello World"
ist das Ergebnis ähnlich wie bei der Ausgabe von cat
. Die Zeichenfolge wird jedoch in Anführungszeichen gesetzt und eine Zahl [1]
ausgegeben, um das erste Element eines Zeichenvektors anzugeben (in diesem Fall das erste und einzige Element):
print("Hello World")
#[1] "Hello World"
Diese Standarddruckmethode sehen wir auch, wenn wir einfach R bitten, eine Variable zu drucken. Beachten Sie, dass die Ausgabe von s
ist wie das Aufrufen von print(s)
oder print("Hello World")
:
s <- "Hello World"
s
#[1] "Hello World"
Oder auch ohne etwas zuzuordnen:
"Hello World"
#[1] "Hello World"
Wenn wir eine zweite Zeichenkette als zweites Element des Vektors hinzufügen (mit der Funktion c()
, um die Elemente zusammen zu ketten), unterscheidet sich das Verhalten von print()
deutlich von dem von cat
:
print(c("Hello World", "Here I am."))
#[1] "Hello World" "Here I am."
Beachten Sie, dass die c()
Funktion nicht String-Verkettung macht. (Man muss dazu paste
verwenden.) R zeigt an, dass der Zeichenvektor zwei Elemente hat, indem er sie separat zitiert. Wenn wir einen Vektor haben, der lang genug ist, um mehrere Zeilen zu überspannen, druckt R den Index des Elements, beginnend mit jeder Zeile, so wie es [1]
am Anfang der ersten Zeile steht.
c("Hello World", "Here I am!", "This next string is really long.")
#[1] "Hello World" "Here I am!"
#[3] "This next string is really long."
Das spezielle Verhalten von print
hängt von der Klasse des Objekts ab, das an die Funktion übergeben wird.
Wenn wir print
ein Objekt mit einer anderen Klasse aufrufen, z. B. "numerisch" oder "logisch", werden die Anführungszeichen in der Ausgabe weggelassen, um anzuzeigen, dass es sich um ein Objekt handelt, das keine Zeichenklasse ist:
print(1)
#[1] 1
print(TRUE)
#[1] TRUE
Factor-Objekte werden auf dieselbe Art und Weise wie Zeichenvariablen gedruckt, was häufig zu Mehrdeutigkeiten führt, wenn die Konsolenausgabe zum Anzeigen von Objekten in SO-Fragenkörpern verwendet wird. Es ist selten, cat
oder print
außer in einem interaktiven Kontext. Das explizite Aufrufen von print()
ist besonders selten (es sei denn, Sie wollten die Darstellung der Anführungszeichen unterdrücken oder ein Objekt anzeigen, das von einer Funktion als invisible
wird), da die Eingabe von foo
an der Konsole eine Abkürzung für print(foo)
. Die interaktive Konsole von R ist als REPL (Read-Eval-Print-Loop) bekannt. Die cat
Funktion wird am besten für spezielle Zwecke (z. B. Schreiben der Ausgabe in eine offene Dateiverbindung) gespeichert. Manchmal wird es in Funktionen verwendet (bei denen Aufrufe von print()
unterdrückt werden). Die Verwendung von cat()
in einer Funktion zum Erzeugen von Ausgaben für die Konsole ist jedoch eine schlechte Praxis . Die bevorzugte Methode ist message()
oder warning()
für Zwischennachrichten. Sie verhalten sich ähnlich wie cat
, können aber vom Endbenutzer optional unterdrückt werden. Das Endergebnis sollte einfach zurückgegeben werden, damit der Benutzer es ggf. speichern kann.
message("hello world")
#hello world
suppressMessages(message("hello world"))
Lesen oder Schreiben einer Dateiverbindung
Nicht immer haben wir die Freiheit, von einem lokalen Systempfad zu lesen oder in ihn zu schreiben. Wenn zum Beispiel R-Code-Streaming-Map-Reduce die Dateiverbindung lesen und beschreiben muss. Es kann auch andere Szenarien geben, in denen man über das lokale System hinausgeht. Mit dem Aufkommen von Cloud und Big Data wird dies immer häufiger. Eine Möglichkeit, dies zu tun, ist in logischer Reihenfolge.
Stellen Sie eine Dateiverbindung zum Lesen mit dem Befehl file()
("r" steht für den Lesemodus):
conn <- file("/path/example.data", "r") #when file is in local system
conn1 <- file("stdin", "r") #when just standard input/output for files are available
Da dies nur eine Dateiverbindung herstellt, können Sie die Daten von diesen Dateiverbindungen wie folgt lesen:
line <- readLines(conn, n=1, warn=FALSE)
Hier lesen wir die Daten von der Dateiverbindung conn
Zeile für Zeile als n=1
. man kann den Wert von n
(z. B. 10, 20 usw.) ändern, um Datenblöcke für ein schnelleres Lesen zu lesen (10 oder 20 Zeilen Block in einem Durchgang). Um die komplette Datei in einem Schritt zu lesen, setzen Sie n=-1
.
Nach der Datenverarbeitung oder Modellausführung; Sie können die Ergebnisse mit vielen verschiedenen Befehlen wie writeLines(),cat()
usw. in die Dateiverbindung writeLines(),cat()
die in eine Dateiverbindung schreiben können. Alle diese Befehle nutzen jedoch die zum Schreiben eingerichtete Dateiverbindung. Dies kann mit dem Befehl file()
folgt durchgeführt werden:
conn2 <- file("/path/result.data", "w") #when file is in local system
conn3 <- file("stdout", "w") #when just standard input/output for files are available
Dann schreibe die Daten wie folgt:
writeLines("text",conn2, sep = "\n")
Erfassen Sie die Ausgabe des Betriebssystembefehls
Funktionen, die einen Zeichenvektor zurückgeben
Base R
hat zwei Funktionen zum Aufrufen eines Systembefehls. Beide erfordern einen zusätzlichen Parameter, um die Ausgabe des Systembefehls zu erfassen.
system("top -a -b -n 1", intern = TRUE)
system2("top", "-a -b -n 1", stdout = TRUE)
Beide geben einen Zeichenvektor zurück.
[1] "top - 08:52:03 up 70 days, 15:09, 0 users, load average: 0.00, 0.00, 0.00"
[2] "Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie"
[3] "Cpu(s): 0.9%us, 0.3%sy, 0.0%ni, 98.7%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st"
[4] "Mem: 12194312k total, 3613292k used, 8581020k free, 216940k buffers"
[5] "Swap: 12582908k total, 2334156k used, 10248752k free, 1682340k cached"
[6] ""
[7] " PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND "
[8] "11300 root 20 0 1278m 375m 3696 S 0.0 3.2 124:40.92 trala "
[9] " 6093 user1 20 0 1817m 269m 1888 S 0.0 2.3 12:17.96 R "
[10] " 4949 user2 20 0 1917m 214m 1888 S 0.0 1.8 11:16.73 R "
Zur Veranschaulichung wird der UNIX-Befehl
top -a -b -n 1
verwendet. Dies ist betriebssystemspezifisch und muss möglicherweise geändert werden, um die Beispiele auf Ihrem Computer auszuführen.
Package devtools
hat die Funktion, einen Systembefehl auszuführen und die Ausgabe ohne zusätzlichen Parameter zu erfassen. Es gibt auch einen Zeichenvektor zurück.
devtools::system_output("top", "-a -b -n 1")
Funktionen, die einen Datenrahmen zurückgeben
Die Funktion fread
im Paket data.table
ermöglicht das Ausführen eines Shell-Befehls und das Lesen der Ausgabe wie bei read.table
. Es gibt eine data.table
oder einen data.frame
.
fread("top -a -b -n 1", check.names = TRUE)
PID USER PR NI VIRT RES SHR S X.CPU X.MEM TIME. COMMAND
1: 11300 root 20 0 1278m 375m 3696 S 0 3.2 124:40.92 trala
2: 6093 user1 20 0 1817m 269m 1888 S 0 2.3 12:18.56 R
3: 4949 user2 20 0 1917m 214m 1888 S 0 1.8 11:17.33 R
4: 7922 user3 20 0 3094m 131m 1892 S 0 1.1 21:04.95 R
Beachten Sie, dass fread
die oberen 6 Kopfzeilen automatisch übersprungen hat.
Hier wurde der Parameter
check.names = TRUE
hinzugefügt, um%CPU
,%MEN
undTIME+
in syntaktisch gültige Spaltennamen zu konvertieren.