我正在尝试将一个Tibble转换为函数调用的参数列表。我这样做的原因是因为我想创建一个简单的文件说明Tibble,用于读取具有不同列的多个固定宽度文件。这样我只需要使用pull和select来指定文件中的哪些列,然后我就可以自动地加载和解析文件。但是,我遇到了使用cols对象指定列格式的问题。将Tibble转换为参数列表
对于这个例子让我们假设我有格式的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和类型转换为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做到这一点,但是你的代码并不能远程做你想做的事 - 你需要先理解do.call在你之前实际做了些什么可以使用它。 –
我是R新手,所以这都是一种学习体验。我想我明白do.call做了什么,它调用一个函数,其他参数作为参数。根据我对下面答案的评论,我认为在这里逃避的是如何以自动化的方式创建一个命名列表。我不想手动输入所有的field = type参数,我把它们分成两列,我只想让R为我创建指定的列表。 – RandomString
是的,你实际上在你的问题描述中发现。从你的问题来看,你似乎没有理解这一点。但是这部分问题实际上可以通过'setNames'方便地解决。另一个更大的问题是你的参数是字符串,而不是代码。因此,你首先需要对它们进行评估,尽管这是可能的(通过解析/评估),但它很混乱,可能不是一个好主意(以及你的情况)。乔兰的方法是优越的。 –