Функция do.call([) в R

Я изучаю R, поэтому извините, если мой вопрос звучит слишком просто. Вот функция, которую я написал для создания подтаблицы из таблицы. Я следую книге Нормана Матлоффа. Итак, мне снова жаль, если вы считаете, что есть более короткий способ сделать это. Я учусь прямо сейчас, поэтому более длинные методы помогут мне только подтвердить свое понимание 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)

где кт.дат:

"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. Я действительно застрял.

Любая помощь, пожалуйста?


person watchtower    schedule 27.07.2016    source источник
comment
do.call(`[`, dcargs) переводится как tbl[c("No","Yes"), c("No", Yes")]   -  person thelatemail    schedule 27.07.2016
comment
Может быть, это будет поучительно - все следующие идентичны - do.call(`[`, list(cttable, c("No","Yes"), c("No","Yes")) ) и `[`(cttable, c("No","Yes"), c("No","Yes")) и cttable[c("No","Yes"), c("No","Yes")]   -  person thelatemail    schedule 27.07.2016
comment
спасибо thelatemail. У меня есть два дополнительных вопроса: 1) почему вы использовали таблицу tbl? Я вообще не вижу tbl в строке 1. 2) Для дальнейшего использования, как я могу узнать, какая таблица вызывается? Буду признателен за ваши мысли.   -  person watchtower    schedule 27.07.2016
comment
tbl — исходный аргумент функции — он присваивается tblarray, который затем помещается в dcargs. Так что, по сути, это все еще tbl. Подмножество таблицы/объекта всегда является первым аргументом функции `[`.   -  person thelatemail    schedule 27.07.2016
comment
Спасибо thelatemail. Итак, я прочитал справочный документ. Кажется, что функция [ сначала ссылается на dcargs[[1]], который является не чем иным, как копией tbl. Затем dcargs[[2] и dcargs[[3]] извлекают соответствующую строку и столбец, используя подмножество. Я прав? Я был бы искренне признателен за ваши мысли. Я боролся с этим примером около 5 часов.   -  person watchtower    schedule 27.07.2016


Ответы (1)


Наряду с отличным комментарием @thelatemail вы также можете получить дополнительную информацию на странице справки help('['), которая гласит:

индексация с помощью [ аналогична атомарным векторам и выбирает список указанных элементов (элементов)

а из справки к функции do.call читаем

do.call создает и выполняет вызов функции из имени или функции и списка аргументов, которые должны быть переданы ей.

Эта строка вызывает функцию [ со списком аргументов dcargs (названных так, потому что они являются аргументами do.call). Поскольку элементы dcargs являются индексами таблицы, эта строка ссылается на соответствующие индексы объекта списка, содержащиеся в [[2]] и [[3]], которые она собирается индексировать.

Короче говоря, do.call("[",dcargs) индексирует строки «нет» и «да», а также столбцы «нет» и «да» dcargs[[1]].

person shayaa    schedule 27.07.2016