JD Лонга действительно первое, что пришло в голову, а другой:
Filter(function(x) !(12345 %% x), 1:1000)
I т hink это забавно, чтобы избежать необходимости в явном назначении. (Слишком плохо, чтобы каждый раз создавать новую функцию.) (В этом случае «!» Преобразует ненулевое значение в FALSE и от нуля до TRUE. «Фильтр» выбирает каждый элемент с оценкой TRUE.)
избегая также необходимость отдельного выделения и не создавая новую функцию:
which(!(12345 %% 1:1000))
Хронометраж:
> y <- 1:1000
> system.time(replicate(1e5, y[12345 %% y == 0 ]))
user system elapsed
8.486 0.058 8.589
> system.time(replicate(1e5, Filter(function(x) !(12345 %% x), y)))
Timing stopped at: 90.691 0.798 96.118 # I got impatient and killed it
# Even pulling the definition of the predicate outside,
# it's still too slow for me want to wait for it to finish.
# I'm surprised Filter is so slow.
> system.time(replicate(1e5, which(!12345 %% y)))
user system elapsed
11.618 0.095 11.792
Так выглядит метод JD Лонга является победителем.
также, как бы я сделал то же самое в vba? – user446667