首页 > 解决方案 > 为什么使用 sapply 循环时formals() 不需要 names()?

问题描述

我想找出基础 R 中哪个函数的参数数量最多。

> objs <- mget(ls("package:base"), inherits = TRUE)
> funs <- Filter(is.function, objs)

一种简单的方法是使用 sapply 如下

f_arg_length <- sapply(funs, function(x) length(formals(x)))
f_arg_length[which.max(f_arg_length)]

但我也尝试了一个显式循环来做同样的事情,我的代码是

max_fun_name <- ""
max_fun <- 0
for(x in 1:length(funs)) {
  if (length(formals(names(funs[x]))) > max_fun) 
{
  max_fun <-  length(formals(names(funs[x])))
  max_fun_name <- names(funs[x])
}
}
max_fun_name
max_fun

我无法理解为什么在使用索引引用时(如在显式循环中看到的),funs 的元素在formals() 中与names() 一起传递,而在没有索引引用时没有names() 也可以实现相同(如在sapply 的情况)。有人可以解释为什么这两种引用同一事物的方式会产生明显差异的原因吗?

标签: r

解决方案


推荐阅读