1

我有这条线:

system<-c("System configuration: type=Shared mode=Uncapped smt=4 lcpu=96 mem=393216MB psize=64 ent=16.00")

我需要解析这个并选择 smt、lcpu、mem、mpsize 和 ent 进入不同的对象。

例如,我这样做是为了选择 smt,但它选择了整条线,有什么想法我在这里做错了吗?

smt<-sub('^.* smt=([[:digit:]])', '\\1', system)

在这种情况下,smt 需要有一个数字 4。

4

4 回答 4

2

strapplycgusbfn 包中使用以下内容创建一个列表L,其名称是左侧,例如smt,其值是右侧。

library(gsubfn)

LHS <- strapplyc( system, "(\\w+)=" )[[1]]
RHS <- strapplyc( system, "=(\\w+)" )[[1]]
L <- setNames( as.list(RHS), LHS )

例如,我们现在可以得到smt这样的结果(对于其他左侧也类似):

> L$smt
[1] "4"

更新:简化。

于 2013-04-17T20:19:04.213 回答
2

我会使用strsplit几次,并且type.convert

parse.config <- function(x) {
   clean  <- sub("System configuration: ", "", x)
   pairs  <- strsplit(clean, " ")[[1]]
   items  <- strsplit(pairs, "=")
   keys   <- sapply(items, `[`, 1)
   values <- sapply(items, `[`, 2)
   values <- lapply(values, type.convert, as.is = TRUE)
   setNames(values, keys)
}

config <- parse.config(system)
# $type
# [1] "Shared"
# 
# $mode
# [1] "Uncapped"
# 
# $smt
# [1] 4
# 
# $lcpu
# [1] 96
# 
# $mem
# [1] "393216MB"
# 
# $psize
# [1] 64
# 
# $ent
# [1] 16

输出是一个列表,因此您可以访问任何已解析的项目,例如:

config$smt
# [1] 4
于 2013-04-17T18:24:14.463 回答
1

添加.*到匹配表达式的末尾,您将得到“4”。

sub('^.* smt=([[:digit:]]+).*', '\\1', system) 

您可能希望添加+I 包含在实例中超过一位数的位置。

您也可以通过拆分空格并找到匹配项来解决此问题:

splits <- unlist(strsplit(system, ' '))
sub('smt=', '', grep('smt=', splits, value=TRUE))
# [1] "4"

或将其包装在一个函数中:

matchfun <- function(string, to_match, splitter=' ') {
  splits <- unlist(strsplit(string, splitter))
  sub(to_match, '', grep(to_match, splits, value=TRUE))
}

matchfun(system, 'smt=')
# [1] "4"
于 2013-04-17T18:25:03.330 回答
0

好吧,我投票给@GaborGrothendieck,但我将其作为一个更普通的选择:

inp <- c("System configuration: type=Shared mode=Uncapped smt=4 lcpu=96 mem=393216MB psize=64 ent=16.00")
inparsed <- read.table(text=inp, stringsAsFactors=FALSE)
vals <- unlist(inparsed)[grep("\\=", unlist(inparsed))]
vals
#           V3            V4            V5            V6            V7            V8            V9 
#  type=Shared mode=Uncapped         smt=4       lcpu=96  mem=393216MB      psize=64     ent=16.00 
vals[grep("smt|lcpu|mem|mpsize|ent", vals)]
            V5             V6             V7             V9 
       "smt=4"      "lcpu=96" "mem=393216MB"    "ent=16.00" 

我会注意到,鉴于system函数的存在,为变量选择名称“系统”似乎是最不明智的。

于 2013-04-17T20:31:51.500 回答