【发布时间】:2017-09-06 16:13:43
【问题描述】:
我正在尝试将 Tibble 转换为函数调用的参数列表。我这样做的原因是因为我想创建一个简单的文件规范 Tibble 来读取具有不同列的多个固定宽度文件。这样,我只需要使用 pull 和 select 指定文件中的哪些列,然后我就可以自动加载和解析文件。但是,我在使用 cols 对象来指定列格式时遇到了问题。
对于这个例子,假设我有一个格式的小标题:
> (filespec <- tibble(ID = c("Title", "Date", "ATTR"), Length = c(23, 8, 6), Type = c("col_character()", "col_date()", "col_factor(levels=c(123456,654321)")))
# A tibble: 3 x 3
ID Length Type
<chr> <dbl> <chr>
1 Title 23 col_character()
2 Date 8 col_date()
3 ATTR 6 col_factor(levels=c(123456,654321)
我想得到一个 cols 格式的对象:
> (cols(Title = col_character(), Date = col_date(), ATTR=col_factor(levels=c(123456,654321))))
cols(
Title = col_character(),
Date = col_date(format = ""),
ATTR = col_factor(levels = c(123456, 654321), ordered = FALSE)
)
从我读过的其他问题中,我知道这可以通过 do.call 完成。但我不知道如何以自动方式将列 ID 和 Type 转换为 cols 对象。这是我尝试过的一个示例...
> do.call(cols, select(filespec,ID, Type))
Error in switch(x, `_` = , `-` = col_skip(), `?` = col_guess(), c = col_character(), :
EXPR must be a length 1 vector
我假设选择需要用另一个执行行到参数映射的函数包装,这是怎么做的?
【问题讨论】:
-
您可能可以使用
do.call执行此操作,但您的代码并不能远程执行您想要的操作——您需要先了解@ 987654325@实际上是在你可以使用它之前。 -
我是 R 新手,所以这都是一次学习经历。我想我理解 do.call 的作用,它以其他参数作为参数调用一个函数。根据我对下面答案的评论,我认为在这里逃避的是如何以自动方式创建命名列表。我不想手动输入所有 field=type 参数,我将它们放在两列中,我只想让 R 为我创建命名列表。
-
是的,您实际上在问题描述中很准确。从您的问题来看,您似乎没有理解这一点。但是这部分问题实际上可以使用
setNames轻松解决。另一个更大的问题是您的参数是字符串,而不是代码。因此,您首先需要评估它们,虽然这是可能的(通过 parse/eval),但它很混乱,并且可能不是一个好主意(嗯;在您的情况下可能是这样)。 Joran 的方法更胜一筹。
标签: r parameter-passing do.call tibble