Szukaj…


Uwagi

Powiązane dokumenty:

Drukowanie i wyświetlanie napisów

R ma kilka wbudowanych funkcji, których można używać do drukowania lub wyświetlania informacji, ale print i cat są najbardziej podstawowe. Ponieważ R jest językiem interpretowanym , możesz wypróbować je bezpośrednio w konsoli R:

print("Hello World")
#[1] "Hello World"
cat("Hello World\n")
#Hello World

Zwróć uwagę na różnicę w obu wejściach i wyjściach dla obu funkcji. (Uwaga: w wartości x utworzonej za pomocą x <- "Hello World" nie ma znaków cudzysłowu. Są one dodawane przez print na etapie wyjściowym.)

cat bierze jeden lub więcej wektorów znaków jako argumenty i drukuje je na konsoli. Jeśli wektor znaków ma długość większą niż 1, argumenty są oddzielone spacją (domyślnie):

cat(c("hello", "world", "\n"))
#hello world

Bez znaku nowej linii ( \n ) wynikiem byłoby:

cat("Hello World")
#Hello World> 

Monit o następne polecenie pojawia się natychmiast po wyjściu. (Niektóre konsole, takie jak RStudio, mogą automatycznie dodawać nową linię do ciągów, które nie kończą się nową linią.)

print jest przykładem funkcji „ogólnej”, co oznacza, że wykrywana jest klasa pierwszego przekazanego argumentu i do wyjścia używana jest metoda specyficzna dla klasy. W przypadku wektora postaci, takiego jak "Hello World" , wynik jest podobny do wyjścia cat . Jednak ciąg znaków jest cytowany i wypisywana jest liczba [1] wskazująca pierwszy element wektora znakowego (w tym przypadku pierwszy i jedyny element):

print("Hello World")
#[1] "Hello World"

Ta domyślna metoda drukowania jest również tym, co widzimy, gdy po prostu poprosimy R o wydrukowanie zmiennej. Zwróć uwagę, że wynik wpisywania s jest taki sam, jak wywoływanie print(s) lub print("Hello World") :

s <- "Hello World"
s
#[1] "Hello World"

Lub nawet bez przypisywania go do czegokolwiek:

"Hello World"
#[1] "Hello World"

Jeśli dodamy kolejny ciąg znaków jako drugi element wektora (używając c() funkcji do c oncatenate elementów razem), to zachowanie print() wygląda zupełnie inny od tego z bit cat :

print(c("Hello World", "Here I am."))
#[1] "Hello World" "Here I am."

Zauważ, że funkcja c() nie wykonuje konkatenacji łańcuchów. (W tym celu należy użyć paste ). R pokazuje, że wektor znaków ma dwa elementy, cytując je osobno. Jeśli mamy wektor wystarczająco długi, aby objąć wiele linii, R wypisze indeks elementu rozpoczynający każdą linię, tak jak drukuje [1] na początku pierwszej linii.

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

Konkretne zachowanie print zależy od klasy obiektu przekazanego do funkcji.

Jeśli wywołamy print obiekt z inną klasą, taką jak „numeryczna” lub „logiczna”, cudzysłowy są pomijane w danych wyjściowych, aby wskazać, że mamy do czynienia z obiektem, który nie jest klasą znaków:

print(1)
#[1] 1
print(TRUE)
#[1] TRUE

Obiekty czynnikowe są drukowane w taki sam sposób jak zmienne znakowe, co często powoduje niejednoznaczność, gdy dane wyjściowe konsoli są używane do wyświetlania obiektów w obiektach pytań SO. Rzadko używa się cat lub print z wyjątkiem interaktywnego kontekstu. Wyraźne wywołanie print() jest szczególnie rzadkie (chyba że chcesz ukryć wygląd cudzysłowów lub wyświetlić obiekt, który jest zwracany jako invisible przez funkcję), ponieważ wpisanie foo w konsoli jest skrótem do print(foo) . Interaktywna konsola R jest znana jako REPL, „pętla odczytu-odczytu-wydruku”. Funkcja cat najlepiej jest zapisać do specjalnych celów (np. Zapisywanie danych wyjściowych w otwartym połączeniu pliku). Czasami używa się go w funkcjach (gdzie pomija się wywołania print() ), jednak użycie cat() w funkcji do generowania danych wyjściowych na konsolę jest złą praktyką . Preferowaną metodą jest message() lub warning() dla komunikatów pośrednich; zachowują się podobnie do cat ale mogą być opcjonalnie stłumione przez użytkownika końcowego. Ostateczny wynik powinien po prostu zostać zwrócony, aby użytkownik mógł przypisać go do przechowywania w razie potrzeby.

message("hello world")
#hello world
suppressMessages(message("hello world"))

Odczytywanie lub zapisywanie połączenia pliku

Nie zawsze mamy swobodę odczytu lub zapisu do ścieżki lokalnego systemu. Na przykład, jeśli redukcja przesyłania strumieniowego kodu R musi wymagać odczytu i zapisu połączenia z plikiem. Mogą istnieć również inne scenariusze, w których wykracza się poza system lokalny, a wraz z pojawieniem się chmury i dużych zbiorów danych staje się to coraz bardziej powszechne. Jednym ze sposobów na to jest logiczna sekwencja.

Ustanów połączenie pliku do odczytu za pomocą polecenia file() („r” oznacza tryb odczytu):

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

Ponieważ ustanowi to tylko połączenie plików, można odczytać dane z tych połączeń plików w następujący sposób:

line <- readLines(conn, n=1, warn=FALSE)

Tu czyta dane z pliku połączenia conn linia po linii, jak n=1 . można zmienić wartość n (powiedzmy 10, 20 itd.) w celu odczytu bloków danych w celu szybszego odczytu (blok 10 lub 20 linii odczytywany za jednym razem). Aby odczytać cały plik za jednym razem, ustaw n=-1 .

Po przetworzeniu danych lub powiedz wykonanie modelu; wyniki można zapisać z powrotem do połączenia pliku za pomocą wielu różnych poleceń, takich jak writeLines(),cat() itp., które mogą zapisywać do połączenia pliku. Jednak wszystkie te polecenia będą wykorzystywać połączenie pliku ustanowione do zapisu. Można to zrobić za pomocą polecenia file() jako:

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

Następnie zapisz dane w następujący sposób:

writeLines("text",conn2, sep = "\n")

Przechwyć dane wyjściowe polecenia systemu operacyjnego

Funkcje zwracające wektor znaków

Baza R ma dwie funkcje do wywoływania polecenia systemowego. Oba wymagają dodatkowego parametru, aby przechwycić dane wyjściowe polecenia systemowego.

system("top -a -b -n 1", intern = TRUE) 
system2("top", "-a -b -n 1", stdout = TRUE)

Oba zwracają wektor znaków.

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

Na przykład użyto polecenia UNIX top -a -b -n 1 . Jest to specyficzne dla systemu operacyjnego i może wymagać zmiany, aby uruchomić przykłady na komputerze.

Pakiet devtools ma funkcję uruchamiania polecenia systemowego i przechwytywania danych wyjściowych bez dodatkowego parametru. Zwraca również wektor znaków.

devtools::system_output("top", "-a -b -n 1") 

Funkcje zwracające ramkę danych

Funkcja fread w pakiecie data.table pozwala wykonać polecenie powłoki i odczytać dane wyjściowe jak read.table . Zwraca data.table lub 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

Uwaga: ten fread automatycznie pomija 6 górnych linii nagłówka.

Tutaj check.names = TRUE parametr check.names = TRUE celu konwersji %CPU , %MEN i TIME+ na poprawne składniowo nazwy kolumn.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow