Почему `$` не удалось подмножить элементы списка при передаче в sapply / lapply как аргумент FUN, а `[[` работает? [Дубликат]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

36
задан MrFlick 8 May 2015 в 19:32
поделиться

2 ответа

В первом примере вы можете просто сделать:

lapply(dflist, `$.data.frame`, "a")

Для второго используйте функцию доступа slot()

lapply(mylist, "slot", "tab")

Я не уверен , почему отправка метода не работает в первом случае, но раздел Note в ?lapply действительно затрагивает эту самую проблему его отправки borked методом для примитивных функций, таких как $:

 Note:

 [...]

 For historical reasons, the calls created by ‘lapply’ are
 unevaluated, and code has been written (e.g., ‘bquote’) that
 relies on this.  This means that the recorded call is always of
 the form ‘FUN(X[[i]], ...)’, with ‘i’ replaced by the current
 (integer or double) index.  This is not normally a problem, but it
 can be if ‘FUN’ uses ‘sys.call’ or ‘match.call’ or if it is a
 primitive function that makes use of the call.  This means that it
 is often safer to call primitive functions with a wrapper, so that
 e.g. ‘lapply(ll, function(x) is.numeric(x))’ is required to ensure
 that method dispatch for ‘is.numeric’ occurs correctly.
27
ответ дан Josh O'Brien 19 August 2018 в 09:12
поделиться
  • 1
    Большое спасибо за понимание. Функция slot() - это то, чем я действительно был в конце, поэтому я ценю, что вы привлекли это к моему вниманию. Я добавил еще один ответ, который, я думаю, ближе к «почему». в этом случае. Это действительно больше об общей реализации $, чем lapply(), из того, что я понимаю на данный момент. – MrFlick 8 May 2015 в 20:48

Таким образом, кажется, что эта проблема больше связана с $ и тем, как обычно ожидают, что имена без кавычек будут вторыми параметрами, а не строками. Посмотрите на этот пример

dflist <- list(
    data.frame(a=1:3, z=31:33), 
    data.frame(b=10:12, a=4:6, z=31:33)
)
lapply(dflist, 
    function(x, z) {
        print(paste("z:",z)); 
        `$`(x,z)
    }, 
    z="a"
)

Мы видим результаты

[1] "z: a"
[1] "z: a"
[[1]]
[1] 31 32 33

[[2]]
[1] 31 32 33

, поэтому значение z устанавливается на «a», но $ не оценивает второй параметр. Поэтому он возвращает столбец «z», а не столбец «a». Это приводит к этому интересному набору результатов

a<-"z"; `$`(dflist[[1]], a)
# [1] 1 2 3
a<-"z"; `$`(dflist[[1]], "z")
# [1] 31 32 33

a<-"z"; `$.data.frame`(dflist[[1]], a)
# [1] 31 32 33
a<-"z"; `$.data.frame`(dflist[[1]], "z")
# [1] 31 32 33

. Когда мы называем $.data.frame непосредственно, мы обходим стандартную депарацию, которая встречается в примитиве до отправки (что происходит вблизи здесь в источнике).

Добавленный catch с lapply заключается в том, что он передает аргументы функции через механизм .... Например,

lapply(dflist, function(x, z) sys.call())
# [[1]]
# FUN(X[[2L]], ...)

# [[2]]
# FUN(X[[2L]], ...)

Это означает, что при вызове $ он отбрасывает ... в строку "...". Это объясняет это поведение

dflist<- list(data.frame(a=1:3, "..."=11:13, check.names=F))
lapply(dflist, `$`, "a")
# [[1]]
# [1] 11 12 13

То же самое происходит, когда вы пытаетесь использовать ... самостоятельно

f<-function(x,...) `$`(x, ...); 

f(dflist[[1]], "a");
# [1] 11 12 13
`$`(dflist[[1]], "a")
# [1] 1 2 3
12
ответ дан MrFlick 19 August 2018 в 09:12
поделиться
  • 1
    Я чувствую, что могу быть плотным, но я не совсем понимаю, как это объясняет, почему lapply(dflist, `$`, "a") возвращает NULL. В конце концов, "$"(dflist[[1]], "z") возвращает 31:33, но, по-видимому, эквивалентный вызов lapply(dflist[1], `$`, "z") возвращает NULL ... Что мне не хватает? – Josh O'Brien 8 May 2015 в 21:09
  • 2
    Ах хорошо. ну, есть дополнительный уровень с lapply. Он передает параметры с помощью .... Итак, что происходит, если вы перехватываете вызов, вы видите, что второй параметр, переданный функции, есть «...». Значит, ты прав. Это также связано с тем, как аргументы lapple аргументируют через .... Я тоже добавлю это. – MrFlick 8 May 2015 в 21:12
  • 3
    О, мужик, я понимаю, к чему ты клонишь. Это увлекательно! Проверьте это: df <- data.frame("..."=1:3, z=31:33); dflist <- list(df, df); lapply(dflist, `$`, "z") – Josh O'Brien 8 May 2015 в 21:16
  • 4
    @ JoshO'Brien Хе, да, это именно то, что я редактировал! :) – MrFlick 8 May 2015 в 21:17
Другие вопросы по тегам:

Похожие вопросы: