我正在学习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的用途是什么。我真的卡住了。
请帮忙吗?
答案 0 :(得分:1)
除了@thelatemail好评之外,您还可以从帮助页面help('[')
获取更多信息,其中包含
索引[类似于原子向量并选择指定元素的列表
从帮助到功能do.call
我们阅读了
do.call构造并执行函数调用,从名称或函数以及要传递给它的参数列表。
这一行使用list参数dcargs调用[
函数(因为它们是do.call参数而命名)。由于dcargs的元素是表的索引,因此该行正在做的是引用列表对象的相关索引,它包含在[[2]]和[[3]]中,它将被索引。
简而言之,do.call("[",dcargs)
索引dcargs[[1]]
的no和yes行以及no和yes列。