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 parametern check.names = TRUE för att konvertera %CPU , %MEN och TIME+ till syntaktiskt giltiga kolumnnamn.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow