R中的do.call(" [" ...)函数

时间:2016-07-27 03:57:59

标签: r function do.call

我正在学习R,所以如果我的问题听起来太基础,我很抱歉。这是我编写的用于从表创建子表的函数。我正在关注Norman Matloff的书。所以,如果您认为有更短的方法可以做到这一点,我再次感到抱歉。我现在正在学习,所以更长的方法只能帮助我肯定我对R

的理解
subtable <- function(tbl,subnames)
{
  tblarray <- unclass(tbl)
  dcargs <-list(tblarray)
  ndims <- length(subnames) # number of dimensions
  for(i in 1:ndims)
  {
    dcargs[[i+1]]<-subnames[[i]]
  }
  subarray <-do.call("[",dcargs) ###LINE1###
  dims <-lapply (subnames,length)
  subtbl<-array(subarray,dims,dimnames = subnames)
  class(subtbl)<-"table"
  return(subtbl)
}

现在我使用:

调用函数
ct<-read.table("ct.dat",header=T)

其中ct.dat是:

"Vote.for.X" "Voted.for.X.Last.Time"
"Yes" "Yes"
"Yes" "No"
"No" "No"
"Not Sure" "Yes"
"No" "No"

现在,我打电话

cttable<-table(ct)
subtable(cttable,subnames<-list(Vote.for.X=c("No","Yes"), Voted.for.X.Last.Time=c("No","Yes"))

我得到了正确的子表格。但是,我不知道LINE1在做什么。

我逐行执行代码以查看正在进行的操作。这是我在调用for循环后获得的内容:

> dcargs
[[1]]
          Voted.for.X.Last.Time
Vote.for.X No Yes
  No        2   0
  Not Sure  0   1
  Yes       1   1

[[2]]
[1] "No"  "Yes"

[[3]]
[1] "No"  "Yes"

现在,我知道dcargs将成为&#34; [&#34;的功能参数。除此之外,我不知道LINE 1的用途是什么。我真的卡住了。

请帮忙吗?

1 个答案:

答案 0 :(得分:1)

除了@thelatemail好评之外,您还可以从帮助页面help('[')获取更多信息,其中包含

  

索引[类似于原子向量并选择指定元素的列表

从帮助到功能do.call我们阅读了

  

do.call构造并执行函数调用,从名称或函数以及要传递给它的参数列表。

这一行使用list参数dcargs调用[函数(因为它们是do.call参数而命名)。由于dcargs的元素是表的索引,因此该行正在做的是引用列表对象的相关索引,它包含在[[2]]和[[3]]中,它将被索引。

简而言之,do.call("[",dcargs)索引dcargs[[1]]的no和yes行以及no和yes列。