В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
В первом примере вы можете просто сделать:
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.
Таким образом, кажется, что эта проблема больше связана с $
и тем, как обычно ожидают, что имена без кавычек будут вторыми параметрами, а не строками. Посмотрите на этот пример
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
lapply(dflist, `$`, "a")
возвращает NULL
. В конце концов, "$"(dflist[[1]], "z")
возвращает 31:33
, но, по-видимому, эквивалентный вызов lapply(dflist[1], `$`, "z")
возвращает NULL
... Что мне не хватает?
– Josh O'Brien
8 May 2015 в 21:09
lapply
. Он передает параметры с помощью ...
. Итак, что происходит, если вы перехватываете вызов, вы видите, что второй параметр, переданный функции, есть «...». Значит, ты прав. Это также связано с тем, как аргументы lapple аргументируют через ...
. Я тоже добавлю это.
– MrFlick
8 May 2015 в 21:12
df <- data.frame("..."=1:3, z=31:33); dflist <- list(df, df); lapply(dflist, `$`, "z")
– Josh O'Brien
8 May 2015 в 21:16
slot()
- это то, чем я действительно был в конце, поэтому я ценю, что вы привлекли это к моему вниманию. Я добавил еще один ответ, который, я думаю, ближе к «почему». в этом случае. Это действительно больше об общей реализации$
, чемlapply()
, из того, что я понимаю на данный момент. – MrFlick 8 May 2015 в 20:48