R Language
Leyendo y escribiendo cuerdas.
Buscar..
Observaciones
Documentos relacionados:
Imprimir y mostrar cadenas
R tiene varias funciones integradas que se pueden usar para imprimir o mostrar información, pero las más básicas son print
y cat
. Como R es un lenguaje interpretado , puede probar esto directamente en la consola R:
print("Hello World")
#[1] "Hello World"
cat("Hello World\n")
#Hello World
Note la diferencia tanto en la entrada como en la salida para las dos funciones. (Nota: no hay caracteres de comillas en el valor de x
creado con x <- "Hello World"
. Se agregan mediante print
en la etapa de salida).
cat
toma uno o más vectores de caracteres como argumentos y los imprime en la consola. Si el vector de caracteres tiene una longitud mayor que 1, los argumentos están separados por un espacio (de manera predeterminada):
cat(c("hello", "world", "\n"))
#hello world
Sin el carácter de nueva línea ( \n
) la salida sería:
cat("Hello World")
#Hello World>
La solicitud para el siguiente comando aparece inmediatamente después de la salida. (Algunas consolas, como RStudio, pueden agregar automáticamente una nueva línea a las cadenas que no terminan con una nueva línea).
print
es un ejemplo de una función "genérica", lo que significa que se detecta la clase del primer argumento que se pasa y se utiliza un método específico de la clase para dar salida. Para un vector de caracteres como "Hello World"
, el resultado es similar a la salida de cat
. Sin embargo, la cadena de caracteres se cita y se emite un número [1]
para indicar el primer elemento de un vector de caracteres (en este caso, el primer y único elemento):
print("Hello World")
#[1] "Hello World"
Este método de impresión predeterminado también es lo que vemos cuando simplemente le pedimos a R que imprima una variable. Observe que el resultado de escribir s
es lo mismo que llamar a print(s)
o print("Hello World")
:
s <- "Hello World"
s
#[1] "Hello World"
O incluso sin asignarlo a nada:
"Hello World"
#[1] "Hello World"
Si añadimos otra cadena de caracteres como un segundo elemento del vector (utilizando el c()
función para c oncatenate los elementos entre sí), entonces el comportamiento de print()
se ve un poco diferente de la de cat
:
print(c("Hello World", "Here I am."))
#[1] "Hello World" "Here I am."
Observe que la función c()
no hace concatenación de cadenas. (Uno necesita usar paste
para ese propósito). R muestra que el vector de caracteres tiene dos elementos al citarlos por separado. Si tenemos un vector lo suficientemente largo para abarcar varias líneas, R imprimirá el índice del elemento que comienza en cada línea, tal como se imprime [1]
al comienzo de la primera línea.
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."
El comportamiento particular de la print
depende de la clase del objeto pasado a la función.
Si llamamos print
un objeto con una clase diferente, como "numérico" o "lógico", las comillas se omiten de la salida para indicar que estamos tratando con un objeto que no es una clase de caracteres:
print(1)
#[1] 1
print(TRUE)
#[1] TRUE
Los objetos factoriales se imprimen de la misma manera que las variables de caracteres, lo que a menudo crea ambigüedad cuando la salida de la consola se usa para mostrar objetos en los cuerpos de las preguntas SO. Es raro usar cat
o print
excepto en un contexto interactivo. Llamar explícitamente a print()
es particularmente raro (a menos que desee suprimir el aspecto de las comillas o ver un objeto que una función devuelve como invisible
), ya que ingresar foo
en la consola es un atajo para print(foo)
. La consola interactiva de R se conoce como REPL, un "read-eval-print-loop". La función cat
se guarda mejor para fines especiales (como escribir resultados en una conexión de archivo abierto). A veces se usa dentro de las funciones (donde se suprimen las llamadas a print()
), sin embargo, usar cat()
dentro de una función para generar resultados en la consola es una mala práctica . El método preferido es message()
o warning()
para mensajes intermedios; se comportan de manera similar a cat
pero el usuario final puede suprimirlos opcionalmente. El resultado final simplemente debe devolverse para que el usuario pueda asignarlo para almacenarlo si es necesario.
message("hello world")
#hello world
suppressMessages(message("hello world"))
Leyendo desde o escribiendo a una conexión de archivo
No siempre tenemos la libertad de leer o escribir en una ruta del sistema local. Por ejemplo, si el código R que transmite map-reduce debe leer y escribir en la conexión de archivos. También puede haber otros escenarios donde uno va más allá del sistema local y con el advenimiento de la nube y el big data, esto se está volviendo cada vez más común. Una de las formas de hacerlo es en secuencia lógica.
Establezca una conexión de archivo para leer con file()
comando file()
("r" es para el modo de lectura):
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
Como esto solo establecerá la conexión de archivos, se pueden leer los datos de estas conexiones de archivos de la siguiente manera:
line <- readLines(conn, n=1, warn=FALSE)
Aquí estamos leyendo los datos de conexión de archivo conn
línea por línea como n=1
. se puede cambiar el valor de n
(por ejemplo, 10, 20, etc.) para leer bloques de datos para una lectura más rápida (lectura de bloques de 10 o 20 líneas de una sola vez). Para leer el archivo completo de una sola vez, establezca n=-1
.
Después del procesamiento de datos o decir la ejecución del modelo; uno puede escribir los resultados de nuevo a la conexión de archivos usando muchos comandos diferentes como writeLines(),cat()
etc., que son capaces de escribir en una conexión de archivos. Sin embargo, todos estos comandos aprovecharán la conexión de archivos establecida para la escritura. Esto podría hacerse usando file()
comando file()
como:
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
Luego escribe los datos de la siguiente manera:
writeLines("text",conn2, sep = "\n")
Salida de captura del comando del sistema operativo
Funciones que devuelven un vector de caracteres.
Base R
tiene dos funciones para invocar un comando del sistema. Ambos requieren un parámetro adicional para capturar la salida del comando del sistema.
system("top -a -b -n 1", intern = TRUE)
system2("top", "-a -b -n 1", stdout = TRUE)
Ambos devuelven un vector de caracteres.
[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 "
A modo de ilustración, se utiliza el comando
top -a -b -n 1
UNIX. Esto es específico del sistema operativo y es posible que deba modificarse para ejecutar los ejemplos en su computadora.
El paquete devtools
tiene una función para ejecutar un comando del sistema y capturar la salida sin un parámetro adicional. También devuelve un vector de caracteres.
devtools::system_output("top", "-a -b -n 1")
Funciones que devuelven un marco de datos.
La función fread
en el paquete data.table
permite ejecutar un comando de shell y leer la salida como read.table
. Devuelve un data.table
o un 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
Tenga en cuenta que fread
se ha saltado automáticamente las 6 líneas de encabezado superiores.
Aquí se agregó el parámetro
check.names = TRUE
para convertir%CPU
,%MEN
, yTIME+
en nombres de columna sintácticamente válidos.