R Language
Czytanie i pisanie napisów
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
parametrcheck.names = TRUE
celu konwersji%CPU
,%MEN
iTIME+
na poprawne składniowo nazwy kolumn.