【问题标题】:do.call("["...) function in RR 中的 do.call("["...) 函数
【发布时间】:2016-07-27 03:57:59
【问题描述】:

我正在学习 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 将是“[”的函数参数。除此之外,我不知道 LINE 1 发生了什么。我真的被卡住了。

有什么帮助吗?

【问题讨论】:

  • do.call(`[`, dcargs) 转换为 tbl[c("No","Yes"), c("No", Yes")]
  • 也许这会很有启发性 - 以下所有内容都是相同的 - do.call(`[`, list(cttable, c("No","Yes"), c("No","Yes")) )`[`(cttable, c("No","Yes"), c("No","Yes"))cttable[c("No","Yes"), c("No","Yes")]
  • 感谢最新邮件。我有两个后续问题:1)你为什么使用“tbl”表?我在第 1 行根本看不到“tbl”。 2)为了将来参考,我怎么知道正在调用哪个表?非常感谢您的想法。
  • tbl 是原始函数参数 - 它被分配给 tblarray,然后被放入 dcargs。所以,它本质上仍然是tbl。作为子集的表/对象始终是`[` 函数的第一个参数
  • 感谢 thelatemail。所以,我阅读了帮助文档。似乎[ 函数首先引用了 dcargs[[1]] ,这不过是 tbl 的副本。然后 dcargs[[2] 和 dcargs[[3]] 使用子集提取相应的行和列。我对么?我真诚地感谢你的想法。我在这个例子中挣扎了大约 5 个小时。

标签: r function do.call


【解决方案1】:

除了@thelatemail 很棒的评论,您还可以从帮助页面help('[') 获得更多信息

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多