получить вывод как вектор в R во время цикла - PullRequest
0 голосов
/ 15 сентября 2010

Как я могу получить вывод как вектор в R?

Например, если я хочу иметь

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a

, но я бы хотел найти все i, которые делятравномерно в 123345 (то есть факторы), а не только самый большой.

Ответы [ 3 ]

9 голосов
/ 16 сентября 2010

Может быть более краткий способ сделать это, но я бы сделал это следующим образом:

i <- 1:1000
j <- i[12345 %% i == 0 ]

Результирующий вектор j содержит вектор значений в i, которые являются множителями 12345. В R оператор по модулю равен %%, и его немного сложно найти при поиске самостоятельно. Он скрыт в справочном документе по арифметическим операторам, и вы можете найти его, выполнив поиск +, который должен быть в кавычках, таких как: ?"+", а затем вам нужно немного прочитать.

Вам лучше добавить тег VBA, если вы хотите найти ответ VBA. Но я подозреваю, что это будет связано с оператором VBA по модулю;)

2 голосов
/ 16 сентября 2010

Метод JD Long действительно первый, который пришёл в голову, но другой:

Filter(function(x) !(12345 %% x), 1:1000)

Я думаю, что довольно забавно избегать необходимости явного присваивания.(Вид слишком плох, чтобы каждый раз создавать новую функцию.) (В этом случае «!» Преобразует ненулевое значение в ЛОЖЬ, а ноль в ИСТИНА. «Фильтр» выбирает каждый элемент, оценивающий в ИСТИНА.)

Также избегая необходимости отдельного выделения и не создавая новую функцию:

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

Итак, похоже, что метод Дж. Д. Лонга - победитель.

0 голосов
/ 16 сентября 2010

Вы писали:

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)} a

Код JD Long намного лучше, но если вы хотите, чтобы эта цикличная стратегия работала, попробуйте вместо этого:

a <- vector(mode="list"); for (i in 1:1000) {if (123345 %% i == 0){ a <-c(a,i) } }
as.vector(unlist(a))
...