查看原文
其他

执行系统指令:小如麻雀的函数

Y叔叔 YuLabSMU 2023-10-20

再给大家介绍一下yulab.utils包中的一个小函数。小到只有几行,但是非常方便。

首先安装包是:

install.packages('yulab.utils')

装好之后,加载:

library(yulab.utils)

然后就可以使用了,这次给大家介绍的是exec()函数,它能够运行系统命令。假设你在使用R的时候,想跑一下命令行程序,切换终端总是有点不爽是吧?那么你就可以在R里面运行它,这个不难,用system()指令。exec()也是调用一句system()来干这活。但我给它搞得稍微方便一点,仅此而已。

使用就是把指令传给它,比如用ls列出文件,输出会直接打印出来:

exec('ls -l')
total 32
-rw-r--r-- 1 HUAWEI HUAWEI 1157 Oct  6 10:34 DESCRIPTION
-rw-r--r-- 1 HUAWEI HUAWEI  953 Jun 20 10:26 Makefile
-rw-r--r-- 1 HUAWEI HUAWEI 1562 Aug  5 16:05 NAMESPACE
-rw-r--r-- 1 HUAWEI HUAWEI 4054 Oct  6 10:35 NEWS.md
drwxr-xr-x 1 HUAWEI HUAWEI    0 Oct  6 10:32 R
-rw-r--r-- 1 HUAWEI HUAWEI 1631 Jun  5 15:53 README.Rmd
-rw-r--r-- 1 HUAWEI HUAWEI 1854 Jun  5 15:53 README.md
drwxr-xr-x 1 HUAWEI HUAWEI    0 Sep 13 14:23 inst
drwxr-xr-x 1 HUAWEI HUAWEI    0 Sep 13 14:23 man

如果我想把输出存起来呢?因为我可能从输出中抽取出想要的信息,直接赋值就好了:

x <- exec('ls -l')

每一行输出是一个字符串:

> x[1]
[1] "total 32"
> x[2]
[1] "-rw-r--r-- 1 HUAWEI HUAWEI 1157 Oct 6 10:34 DESCRIPTION"
> x[3]
[1] "-rw-r--r-- 1 HUAWEI HUAWEI 953 Jun 20 10:26 Makefile"

那么我就可以用正则表达式去抽取结果了,比如我想把修改文件的时间拿出来:

sub(".*(\\w{3}\\s+\\d{1-2}).*", "\\1", x[-1])
[1] "Oct 6" "Jun 2" "Aug 5" "Oct 6" "Oct 6" "Jun 5" "Jun 5" "Sep 1"
[9] "Sep 1"

当然另一种做法是我把结果给整理了,变成格式化的输出,然后想要啥就直接拿啥,比如当前这个例子,显然就可以用空白来分割出字段,让我们试试:

> strsplit(x[2:3], "\\s+")
[[1]]
[1] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1157"
[6] "Oct" "6" "10:34" "DESCRIPTION"

[[2]]
[1] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "953"
[6] "Jun" "20" "10:26" "Makefile"

那么全部一起上,再规整一下,下面这个直接就是输出一个矩阵了,想要啥,直接就是下标去取了。

> strsplit(x[-1], "\\s+") |> rbindlist()
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1157" "Oct" "6" "10:34"
[2,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "953" "Jun" "20" "10:26"
[3,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1562" "Aug" "5" "16:05"
[4,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "4054" "Oct" "6" "10:35"
[5,] "drwxr-xr-x" "1" "HUAWEI" "HUAWEI" "0" "Oct" "6" "10:32"
[6,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1631" "Jun" "5" "15:53"
[7,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1854" "Jun" "5" "15:53"
[8,] "drwxr-xr-x" "1" "HUAWEI" "HUAWEI" "0" "Sep" "13" "14:23"
[9,] "drwxr-xr-x" "1" "HUAWEI" "HUAWEI" "0" "Sep" "13" "14:23"
[,9]
[1,] "DESCRIPTION"
[2,] "Makefile"
[3,] "NAMESPACE"
[4,] "NEWS.md"
[5,] "R"
[6,] "README.Rmd"
[7,] "README.md"
[8,] "inst"
[9,] "man"

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存