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

Mul*_*efa 3 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)
Run Code Online (Sandbox Code Playgroud)

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

# take 2

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

do.call(list, xs)
Run Code Online (Sandbox Code Playgroud)

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

WoD*_*oSc 6

您可以先创建一个包含要执行的表达式的字符串(list('your string')在本例中"list( nk = 1, ncross = 1, pmethod = 'backward' )"),使用函数paste添加列表(),然后用parse函数解析表达式,最后用eval函数计算它:

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"
Run Code Online (Sandbox Code Playgroud)

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

我希望这能帮到您.