【发布时间】:2011-04-12 21:16:01
【问题描述】:
如何在 R 中将输出作为向量获取?
例如,如果我想拥有
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
但我想找到所有i 均分到 123345(即因子),而不仅仅是最大的一个。
【问题讨论】:
-
另外,我如何在 vba 中做同样的事情?
如何在 R 中将输出作为向量获取?
例如,如果我想拥有
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
但我想找到所有i 均分到 123345(即因子),而不仅仅是最大的一个。
【问题讨论】:
可能有更简洁的方法可以做到这一点,但我会这样做:
i <- 1:1000
j <- i[12345 %% i == 0 ]
生成的向量j 包含 i 中的值的向量,这些值是 12345 的因数。在 R 中,模运算符是 %%,在您自己搜索时很难找到它。它隐藏在算术运算符的帮助文档中,您可以通过搜索+ 找到它,它必须用引号括起来,例如:?"+",然后您必须仔细阅读。
如果您想找到 VBA 答案,最好添加 VBA 标签。但我怀疑它会涉及 VBA 模运算符 ;)
【讨论】:
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 的方法是赢家。
【讨论】:
integer: system.time(replicate(1e5, y[12345L %% y == 0L ]))。 (0L 表示as.integer(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))
【讨论】: