【问题标题】:Why doesn't this object get assigned in this `if` statement in R?为什么这个对象没有在 R 的 if 语句中被赋值?
【发布时间】:2011-08-02 21:30:14
【问题描述】:

我正在尝试通过使用 R 解决这个 ProjectEuler 问题来学习 R。

如果我在函数中使用cat,我可以获得正确值的列表:

> n <- 1:9
> s <- 0
> ck <- function(n)
+   for(i in n) 
+     if(i/3 == round(i/3) | i/5 == round(i/5)) cat(i) 
> ck(n) 
3569> 

但如果我尝试将这些分配给一个对象以对它们求和,则它不起作用:

> n <- 1:9
> s <- 0
> ck <- function(n)
+   for(i in n) 
+     if(i/3 == round(i/3) | i/5 == round(i/5)) s <- c(s, i) 
> ck(n)
> s
[1] 0
>

为什么第二个功能不起作用?

谢谢。

【问题讨论】:

  • 另外,为了您自己,请在您的函数、for 和 if 语句中使用 { }!
  • 您可能还想考虑%%函数,它是函数:例如en.wikipedia.org/wiki/Modulo_operatorn %% 3
  • @Gavin Simpson - 感谢您的建议,我想一定有更好的方法来做到这一点!
  • @Gavin 已经暗示了这个方向,但我会添加强制性的 R 矢量化注释:n[n %% 3 == 0 | n %% 5 == 0]

标签: function r


【解决方案1】:

全球/本地混乱。定义ck()sinside,并返回。类似的东西

   ck <- function(n) {
     s <- 0
     for(i in n) {  
       if(i/3 == round(i/3) | i/5 == round(i/5)) {
         s <- c(s, i) 
       }
     }
     s
   }

【讨论】:

  • 也许我没看到,但n 是 OP 示例中的一个向量...什么是不正确的索引?
  • 哦,对了——更正了。即便如此,最好是明确地使用,例如,seq_along()。但现在我们正在讨论风格......
猜你喜欢
  • 2019-11-06
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2017-01-26
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多