在循环期间将输出作为R中的向量输出

时间:2010-09-15 19:53:30

标签: vba r vector modulo

如何将输出作为R中的向量?

例如,如果我想拥有

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

但我希望找到均匀分配到123345(即因子)的所有i,而不仅仅是最大的那些。

3 个答案:

答案 0 :(得分:9)

可能有一种更简洁的方法可以做到这一点,但我会这样做:

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

结果向量j包含i中值为12345的因子的向量。在R中,模运算符是%%,当你自己搜索时,它是一个很难找到的婊子。它隐藏在算术运算符的帮助文档中,你可以通过搜索+来找到它,它必须是引号,如:?"+",然后你必须读一下。

如果要查找VBA答案,最好添加VBA标记。但我怀疑它将涉及VBA模运算符;)

答案 1 :(得分:2)

JD Long的方法实际上是第一个想到的方法,但另一个方法:

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

我认为避免任何明确分配的需要会很有趣。 (每次创建一个新函数都太糟糕了。)(在这种情况下,“!”将非零值转换为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 Long的方法就是赢家。

答案 2 :(得分:0)

您写道:

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))