我有一个用户编写的函数,我希望它能够同时传递列表和单参数参数。列表可以是不同的长度。下面是一个简化的例子,我使用expand.grid和use map组合了列表:
fake_dat <- as.data.frame(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
one_lst <- c("a","b")
two_lst <- c("aa","bb")
all_lst <- expand.grid(one_lst, two_lst)
with(all_lst, Map(function(var1, var2, dat, x) {
print(var1)
print(var2)
print(dat[[x]])
}, Var1, Var2, dat=fake_dat, x="V2"))
使用这种方法,我得到了以下错误:
Error in (function (cond) :
error in evaluating the argument 'x' in selecting a method for function 'print': subscript out of bounds
但是,如果我在list中嵌入单个参数,它似乎可以工作:
with(all_lst, Map(function(var1, var2, dat, x) {
print(var1)
print(var2)
print(dat[[x]])
}, Var1, Var2, dat=list(fake_dat), x=list("V2")))
对于我的场景来说,这是使用map的适当方式吗......还是有更好的方式来完成向函数传递一些列表(可能具有不同的长度)和一些单参数参数?
1条答案
按热度按时间kb5ga3dv1#
我们并不清楚您要实现的具体目标,但错误是因为
fake_dat
的length = 2(data.frame
中的列数),因此Map
一次将这些列传递给函数。“V2”超出了界限。这就是为什么用list()
Packagefake_dat
可以解决这个错误--整个data.frame
被传递给函数,因为list(fake_dat)
的长度为1。(此处,用list()
Package “V2”不起任何作用。)请注意,如果
Map
的向量参数长度不同,则会循环使用较短的参数。