Есть ли способ получить доступ к номеру итерации в replicate()?

Есть ли способ получить доступ к текущему номеру репликации в функции replicate, чтобы я мог использовать его как переменную при повторной оценке? Например, в этом тривиальном примере я хотел бы использовать текущий номер репликации для создания списка векторов переменной длины текущего номера репликации. Например, x ниже будет представлять текущую реплику:

replicate( 3 , rep( x , sample.int(5,1) ) )

Я знаю, что этот тривиальный пример легко сделать с помощью lapply

lapply( 1:3 , function(x) rep( x , sample.int(5,1) ) )

Но можете ли вы получить доступ к счетчику репликации в replicate?


person Simon O'Hanlon    schedule 11.04.2013    source источник
comment
replicate просто вызывает sapply, который, в свою очередь, запускает lapply. Это функция удобства. Так что я думаю, что это не предназначено для этого.   -  person Arun    schedule 11.04.2013
comment
... и я думаю, что вам лучше всего (l|s)apply больше 1:n, как вы сделали. Я не уверен, почему это может быть проблематично.   -  person thelatemail    schedule 11.04.2013
comment
... или просто напишите цикл for. Там нет штрафа по времени, и вам может быть проще манипулировать индексной переменной.   -  person Carl Witthoft    schedule 11.04.2013


Ответы (1)


Нет, по крайней мере, не поддерживаемым и удобным для пользователя способом. Как сказал Арун:

> replicate
function (n, expr, simplify = "array") 
sapply(integer(n), eval.parent(substitute(function(...) expr)), 
    simplify = simplify)
...

> sapply
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 
{
    FUN <- match.fun(FUN)
    answer <- lapply(X = X, FUN = FUN, ...)
    ...

Вот что увидит sapply, если вы пройдете 3:

> integer(3)
[1] 0 0 0

Почему бы вам не написать собственную версию replicate для использования в качестве ярлыка?

person krlmlr    schedule 11.04.2013
comment
Спасибо. Я мог бы просто обсудить это с вами или придерживаться lapply! - person Simon O'Hanlon; 11.04.2013
comment
Кто-нибудь сделал это? Обновлять? - person Travis Heeter; 23.01.2017