捕获操作系统命令的输出

返回字符向量的函数

Base R 有两个用于调用系统命令的函数。两者都需要一个额外的参数来捕获系统命令的输出。

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

两者都返回一个字符向量。

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

例如,使用 UNIX 命令 top -a -b -n 1。这是特定于操作系统的,可能需要进行修改才能在你的计算机上运行示例。

devtools 具有运行系统命令并捕获输出而无需额外参数的功能。它还返回一个字符向量。

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

返回数据帧的函数

data.table 中的 fread 函数允许执行 shell 命令并读取像 read.table 这样的输出。它返回 data.tabledata.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

注意,fread 自动跳过了前 6 个标题行。

这里添加了参数 check.names = TRUE,将%CPU%MENTIME+转换为语法上有效的列名。