x<- split(mtcars,mtcars$cyl)
 sapply(x,'[',"mpg")

"Из приведенного выше кода может кто-нибудь объяснить мне, почему я могу получить следующий результат и почему добавление '[' в sapply может привести к следующему результату?"

$`4.mpg`
 [1] 22.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4

$`6.mpg`
[1] 21.0 21.0 21.4 18.1 19.2 17.8 19.7

$`8.mpg`
 [1] 18.7 14.3 16.4 17.3 15.2 10.4 10.4 14.7 15.5 15.2 13.3 19.2 15.8 15.0
0
Huang 7 Янв 2017 в 16:27
3
Просто посмотрите help('[').
 – 
Sotos
7 Янв 2017 в 16:34
4
В R все является функцией. [ также является функцией. Прочтите это.
 – 
Axeman
7 Янв 2017 в 16:35
Вот отличное объяснение того, почему и как это работает: adv-r.had .co.nz / Functions.html # all-calls.
 – 
Andrew Brēza
7 Янв 2017 в 17:25

1 ответ

Лучший ответ

Если вы посмотрите на аргументы для sapply(), вы увидите, что первые три безымянных аргумента, переданные ему, будут обрабатываться как входные данные (X), функция, которая будет применяться (FUN ) и дополнительные аргументы для передачи этой функции (...)

> args('sapply')
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 

> help('sapply')
...
     X: a vector (atomic or list) or an ‘expression’ object.  Other
          objects (including classed objects) will be coerced by
          ‘base::as.list’.

     FUN: the function to be applied to each element of ‘X’: see
          ‘Details’.  In the case of functions like ‘+’, ‘%*%’, the
          function name must be backquoted or quoted.

     ...: optional arguments to ‘FUN’.

Поэтому, когда вы вызываете sapply(x,'[',"mpg") в списке, полученном в результате разделения на mpg, вы фактически вызываете оператор индексации [ для каждого элемента в списке и передаете строку mpg к нему, например:

x$`4`['mpg']
                mpg
Datsun 710     22.8
Merc 240D      24.4
Merc 230       22.8
Fiat 128       32.4
Honda Civic    30.4
Toyota Corolla 33.9
Toyota Corona  21.5
Fiat X1-9      27.3
Porsche 914-2  26.0
Lotus Europa   30.4
Volvo 142E     21.4

Наконец, в процессе сборки результатов обратно в список имена теряются, поэтому вы получаете:

$`4.mpg`
 [1] 22.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4
4
Keith Hughitt 7 Янв 2017 в 16:40