2016-07-27 2 views
0

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

Я выполнил код по очереди, чтобы узнать, что происходит. Вот что я получил после вызова для цикла:

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

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

+2

'do.call (\' [\ ', dcargs)' переводится в 'tbl [c (« Нет »,« Да »), c (« Нет »,« Да »)]' – thelatemail

+3

Возможно, это будет просветительское - все следующие идентичны - 'do.call (\' [\ ', list (cttable, c (« Нет »,« Да »), c (« Нет »,« Да »)))' и '\ '[\' (cttable, c («Нет», «Да»), c («Нет», «Да»)) 'и' cttable [c («Нет», «Да»), c («Нет») , «Да»)] ' – thelatemail

+0

спасибо thelatemail. У меня есть два вопроса: 1) почему вы использовали таблицу« tbl »? Я вообще не вижу« tbl »в строке 1. 2) как я могу узнать, какая таблица вызывается? Я бы оценил ваши мысли. – watchtower

ответ

1

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

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

и с помощью функционировать do.call мы читаем

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

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

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

Смежные вопросы