我希望能够通过 ...
传递一个未定义数量的参数给函数,但同时也可以传递一个 vector
。以下是一个愚蠢的例子:
library(tidyverse)
df <- data.frame(gear = as.character(unique(mtcars$gear)),
id = 1:3)
myfun <- function(...) {
ids_lst <- lst(...)
df2 <- bind_rows(map(ids_lst, function(x)
mtcars %>%
filter(gear == x) %>%
select(mpg)), .id = "gear") %>%
left_join(df)
df2
}
#these all work:
myfun(3)
myfun(3, 4)
myfun(3, 4, 5)
不过将其传递给向量是行不通的:
myvector <- unique(mtcars$gear)
myfun(myvector)
问题出在该函数收集参数和返回结果的方式上:
myfun_lst <- function(...) {
ids_lst <- lst(...)
ids_lst
}
myfun_lst(3, 4, 5)
# $`3`
# [1] 3
# $`4`
# [1] 4
# $`5`
# [1] 5
myfun_lst(myvector)
# $myvector
# [1] 4 3 5
我认为修复方法就是测试输入是否为向量
,可以像这样:
myfun_final <- function(...) {
if(is.vector(...) & !is.list(...)) {
ids_lst <- as.list(...)
names(ids_lst) <- (...)
} else {
ids_lst <- lst(...)
}
df2 <- bind_rows(map(ids_lst, function(x)
mtcars %>%
filter(gear == x) %>%
select(mpg)), .id = "gear") %>%
left_join(df)
df2
}
现在,向函数传递一个向量是可行的,但收集参数却不行:
myfun_final(3, 4, 5)
myfun_final(myvector)
有什么好的方法来解决这个问题吗? 谢谢
do.call(myfun_final, myvector)
或exec(myfun_final, myvector)
吗? - ekoammyfun_final(myvector)
已经可以工作。myfun_final(3, 4, 5)
不能工作? - user63230if
语句能够确定提供的是哪一个,但事实并非如此! - user63230