R:如何在省略号中使用列表元素(如参数)?

2024-02-19

我不确定我的问题标记是否正确,但我试一试:

我想使用一个带有使用省略号的函数的包,func(...)。我所有的课堂论点My_Class都在一个列表中。因为我有很多争论,所以我想避免func(arg1, arg2, arg3)。所以理想情况下我想做func( my_list )。问题是这个函数看起来像这样

function(...) {
  cl <- match.call(expand.dots = FALSE)
  names <- lapply(cl[[2]],as.character)  
  ev <- parent.frame()
  classes <- unlist(lapply(names,function(name){class(get(name,envir=ev))}))    
  if( !all( classes == "My_Class" ) ) { 
    stop("an argument to ... is not a My_Class")
  }
}

所以传递一个列表是行不通的。

我也尝试过func(my_list[[1]], my_list[[2]]) and func(as.expression(my_list[[1]])),但即使它们也不起作用。作为func将参数视为字符,func(my_list[[1]])变成chr [1:3] "[[" "my_list" "1"里面,和get(name,envir=ev)崩溃。我也尝试过do.call(func, my_list)但这再次崩溃my_list被评估,因此name函数内部不再是character but a My_CLass然后再次get(name,envir=ev)崩溃。

所以我的问题是:如何在不更改包/底层功能的情况下完成提交列表?我想过写一个包装器,但我被困住了,因为我什至不能func(my_list[[1]])做工作。也许我只是缺少解决我的问题的正确术语。

提前致谢!


这是可行的,但我对该函数中的设计选择感到困惑:

lst <- list(
  a=structure(1:3, class="My_Class"), 
  b=structure(letters[1:3], class="My_Class")
)
env <- list2env(lst)
call <- as.call(append(list(fun), names(lst)))
eval(call, env)

为了欺骗该函数工作,您必须在列表项是对象的环境中对其进行评估(这就是list2env确实,创造了那个环境)。

该函数的可怕之处在于它会在以下位置查找对象parent.frame根据他们的名字,假设...值确实是名称。我真的不明白为什么这个函数不只是做类似的事情:

if(!all(vapply(list(...), class, "") == "My_Class")) stop(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:如何在省略号中使用列表元素(如参数)? 的相关文章

随机推荐