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

gusbfn パッケージで使用strapplycすると、名前が のような左側で、値が右側であるリストが作成されます。Lsmt

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 が 1 桁以上のインスタンスに含まれている場合は、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 に答える