我正在尝试将一个 Tibble 转换为函数调用的参数列表。我这样做的原因是想创建一个简单的文件规范 Tibble,以便读取具有不同列的多个固定宽度文件。这样,我只需要使用 pull 和 select 指定文件中的列,然后就可以自动加载和解析文件。然而,我在使用 cols 对象指定列格式时遇到了问题。
对于本例,假设我有一个格式为 Tibble 的数据:
我希望最终得到一个cols对象,格式如下:
我假设需要将select语句包装在另一个函数中,以执行行到参数的映射,这应该如何完成?
对于本例,假设我有一个格式为 Tibble 的数据:
> (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
我假设需要将select语句包装在另一个函数中,以执行行到参数的映射,这应该如何完成?
do.call
来完成这个任务,但是你的代码目前根本没有实现你想要的功能——在使用它之前,你需要先了解do.call
的实际作用。 - Konrad RudolphsetNames
可以很容易地解决问题的这一部分。另一个更大的问题是你的参数是字符串,而不是代码。因此,你需要先评估它们,虽然这是可能的(通过 parse/eval),但是这样做会很混乱,也可能不是一个好主意(嗯;在你的情况下可能是)。Joran 的方法更优秀。 - Konrad Rudolph