R Language
Läsa och skriva strängar
Sök…
Anmärkningar
Relaterade dokument:
Skriva ut och visa strängar
R har flera inbyggda funktioner som kan användas för att skriva ut eller visa information, men print
och cat
är de mest grundläggande. Eftersom R är ett tolkat språk kan du prova dessa direkt i R-konsolen:
print("Hello World")
#[1] "Hello World"
cat("Hello World\n")
#Hello World
Observera skillnaden i både ingång och utgång för de två funktionerna. (Obs: det finns inga citat-tecken i värdet på x
skapat med x <- "Hello World"
. De läggs till via print
i utgångsstadiet.)
cat
tar en eller flera karaktärvektorer som argument och skriver ut dem till konsolen. Om teckenvektorn har en längd större än 1, separeras argumenten med ett mellanslag (som standard):
cat(c("hello", "world", "\n"))
#hello world
Utan det nya linjetecknet ( \n
) skulle utgången vara:
cat("Hello World")
#Hello World>
Frågan till nästa kommando visas omedelbart efter utgången. (Vissa konsoler som RStudios kan automatiskt lägga till en ny linje i strängar som inte slutar med en ny linje.)
print
är ett exempel på en "generisk" funktion, vilket innebär att klassen för det första argumentet som skickas upptäcks och en klassspecifik metod används för att mata ut. För en karaktärvektor som "Hello World"
, är resultatet lika med cat
resultat. Teckensträngen citeras emellertid och ett tal [1]
matas ut för att indikera det första elementet i en teckenvektor (i detta fall det första och enda elementet):
print("Hello World")
#[1] "Hello World"
Den här standardutskriftsmetoden är också vad vi ser när vi helt enkelt ber R att skriva ut en variabel. Lägg märke till hur utgången från att skriva s
är densamma som att ringa print(s)
eller print("Hello World")
:
s <- "Hello World"
s
#[1] "Hello World"
Eller till och med utan att tilldela det till någonting:
"Hello World"
#[1] "Hello World"
Om vi lägger till en annan teckensträng som ett andra element i vektorn (med c()
-funktionen för att c sätta samman elementen), ser beteendet hos print()
ut ganska annorlunda från cat
:
print(c("Hello World", "Here I am."))
#[1] "Hello World" "Here I am."
Observera att c()
-funktionen inte gör string-sammanlänkning. (Man måste använda paste
för det ändamålet.) R visar att teckenvektorn har två element genom att citera dem separat. Om vi har en vektor som är tillräckligt lång för att sträcka sig över flera linjer, kommer R att skriva ut indexet för elementet som börjar varje rad, precis som det skrivs ut [1]
i början av den första raden.
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."
Den särskilda beteende print
beror på den klass av objekt som skickas till funktionen.
Om vi kallar print
ett objekt med en annan klass, till exempel "numeriskt" eller "logiskt", utelämnas citaten från utgången för att indikera att vi har att göra med ett objekt som inte är teckenklass:
print(1)
#[1] 1
print(TRUE)
#[1] TRUE
Faktorobjekt skrivs ut på samma sätt som teckenvariabler, vilket ofta skapar oklarhet när konsolutgång används för att visa objekt i SO-frågeställningar. Det är sällsynt att använda cat
eller print
utom i ett interaktivt sammanhang. Att print()
uttryckligt print()
är särskilt sällsynt (såvida du inte vill undertrycka citatens utseende eller se ett objekt som returneras som invisible
av en funktion), eftersom det att gå in i foo
på konsolen är en genväg för print(foo)
. Den interaktiva konsolen till R är känd som en REPL, en "read-eval-print-loop". cat
sparas bäst för speciella ändamål (som att skriva ut till en öppen filanslutning). Ibland används det inuti funktioner (där samtal för att print()
undertrycks), men det är dåligt att använda cat()
inuti en funktion för att generera utdata till konsolen . Den föredragna metoden är att message()
eller warning()
för mellanmeddelanden; de beter sig på samma sätt som cat
men kan eventuellt undertryckas av slutanvändaren. Det slutliga resultatet ska helt enkelt returneras så att användaren kan tilldela det att lagra det vid behov.
message("hello world")
#hello world
suppressMessages(message("hello world"))
Läser från eller skriver till en filanslutning
Vi har inte alltid frihet att läsa från eller skriva till en lokal systemväg. Om till exempel R-kodströmning kartminskning måste behöva läsa och skriva till filanslutning. Det kan också finnas andra scenarier där man går utöver det lokala systemet och med tillkomsten av moln och big data blir detta allt vanligare. Ett av sättet att göra detta är i logisk sekvens.
Upprätta en filanslutning för att läsa med kommandot file()
("r" är för läsläge):
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
Eftersom detta bara skapar filanslutning kan man läsa data från dessa filanslutningar på följande sätt:
line <- readLines(conn, n=1, warn=FALSE)
Här läser vi data från filanslutning conn
rad för rad som n=1
. man kan ändra värdet på n
(säg 10, 20 etc.) för att läsa datablock för snabbare läsning (10 eller 20 rader blockerar läsning på en gång). För att läsa komplett fil på en gång, ställ n=-1
.
Efter databehandling eller säga modellutförande; man kan skriva resultaten tillbaka till filanslutning med många olika kommandon som writeLines(),cat()
etc. som kan skriva till en filanslutning. Men alla dessa kommandon kommer att utnyttja filanslutningen upprättad för skrivning. Detta kan göras med file()
-kommandot som:
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
Skriv sedan data enligt följande:
writeLines("text",conn2, sep = "\n")
Fånga utgången från operativsystemkommandot
Funktioner som returnerar en teckenvektor
Base R
har två funktioner för att åberopa ett systemkommando. Båda kräver en extra parameter för att fånga ut systemkommandot.
system("top -a -b -n 1", intern = TRUE)
system2("top", "-a -b -n 1", stdout = TRUE)
Båda returnerar en teckenvektor.
[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 "
Som exempel används UNIX-kommandot
top -a -b -n 1
. Detta är OS-specifikt och kan behöva ändras för att köra exemplen på din dator.
Package devtools
har en funktion för att köra ett systemkommando och fånga utdata utan ytterligare parameter. Det returnerar också en teckenvektor.
devtools::system_output("top", "-a -b -n 1")
Funktioner som returnerar en dataram
fread
i data.table
gör det möjligt att utföra ett skalkommando och läsa utgången som read.table
. Det returnerar en data.table
eller en 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
Observera att fread
automatiskt har hoppat över de sex främsta rubrikraderna.
Här
check.names = TRUE
parameterncheck.names = TRUE
för att konvertera%CPU
,%MEN
ochTIME+
till syntaktiskt giltiga kolumnnamn.