将逗号分隔的字符串作为列表传递

时间:2014-06-04 11:53:23

标签: r

说我有一个字符串,例如"x = 1, y = 'cat', z = NULL"。我想获取代码list(x = 1, z = 'cat', z = NULL)创建的列表。这是我的第一次尝试,我知道这是可怕的

parse_text <- function(x) parse(text = x)[[1]]
strsplit2 <- function(x, ...) strsplit(x, ...)[[1]] 
trim_whitespace <- function (x) gsub("^\\s+|\\s+$", "", x)

# take 1

x <- "nk = 1, ncross = 1, pmethod = 'backward'"
x <- strsplit2(x, ",")
xs <- lapply(x, strsplit2, "=")
keys <- lapply(xs, function(x) trim_whitespace(x[1]))
vals <- lapply(xs, function(x) parse_text(x[2]))

setNames(vals, keys)

这就是我想象的一种更规范的方法:

# take 2

x <- "nk = 1, ncross = 1, pmethod = 'backward'"
x <- strsplit2(x, ",")
xs <- lapply(x, parse_text)

do.call(list, xs)

但这会失去名单的名字。任何帮助非常感谢!干杯

3 个答案:

答案 0 :(得分:6)

您可以先创建一个包含要执行的表达式的字符串(例如list('your string'),在本例中为"list( nk = 1, ncross = 1, pmethod = 'backward' )"),并使用函数paste添加 列表( ,然后使用parse函数解析表达式,最后使用eval函数对其进行评估:< / p>

x <- "nk = 1, ncross = 1, pmethod = 'backward'" #your string
eval(parse(text=paste('list(',x,')'))) #create and returns the desired list
$nk
[1] 1

$ncross
[1] 1

$pmethod
[1] "backward"

如图所示,这将返回正确的命名列表。

我希望这会对你有所帮助。

答案 1 :(得分:0)

这是另一种方法,避免可怕的parse&amp; eval路由(但恕我直言,完全适合此用例)。它依赖于tag=value配对的一致性,由,分隔。

x <- "nk = 1, ncross = 1, pmethod = 'backward'"

# Split into tag=value
vals <- strsplit( x , "," )[[1]]

# Split again and transform to matrix of tags and values
mat <- do.call( rbind , strsplit( vals , "=" ) )

# Return as a list
setNames( as.list( mat[,2] ) , mat[,1] )

#$`nk `
#[1] " 1"

#$` ncross `
#[1] " 1"

#$` pmethod `
#[1] " 'backward'"

答案 2 :(得分:0)

将逗号转换为分号,将source字符串转换为环境e并将e转换为列表:

source(textConnection(chartr(",", ";", s)), local = e <- new.env())
as.list(e)

,并提供:

$x
[1] 1

$y
[1] "cat"

$z
NULL