向R函数传递不同长度的列表参数

qltillow  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(165)

我有一个用户编写的函数,我希望它能够同时传递列表和单参数参数。列表可以是不同的长度。下面是一个简化的例子,我使用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的适当方式吗......还是有更好的方式来完成向函数传递一些列表(可能具有不同的长度)和一些单参数参数?

kb5ga3dv

kb5ga3dv1#

我们并不清楚您要实现的具体目标,但错误是因为fake_dat的length = 2(data.frame中的列数),因此Map一次将这些列传递给函数。“V2”超出了界限。这就是为什么用list() Package fake_dat可以解决这个错误--整个data.frame被传递给函数,因为list(fake_dat)的长度为1。(此处,用list() Package “V2”不起任何作用。)

with(all_lst, Map(function(var1, var2, dat, x) {
  print(var1)
  print(var2)
  print(dat[[x]])
}, Var1, Var2, dat=list(fake_dat), x="V2"))

请注意,如果Map的向量参数长度不同,则会循环使用较短的参数。

相关问题