R编程帮助:如何编写函数

3
我正在编写一个代码,它将显示一个向量,该向量仅显示不能被2、3或7整除的元素。
function2 <- function(x){
    k <- length(x)
    for(i in 1:x){
        if(i%%2!=0 | i%%3!=0 | i%%7!=0){
            return x[i]
        }
    }
}

它一直给我报错。有人能帮忙吗?

我对编写代码还很陌生,总是遇到麻烦。

如果有任何建议改进的地方,将不胜感激。

谢谢。

我做了一些修改,又出现了一个警告消息。

function2 <- function(x) {
    k <- length(x)
    for(i in 1:x){
        if(i%%2!=0 | i%%3!=0 | i%%7!=0) {
            show(x[i])
        } else {
            i <- i+1
        }
        print(x[i])
    }
}

x <- 1:100
function2(1:100)
## [1] 1
## [1] 1
## Warning message:
## In 1:x : numerical expression has 100 elements: only the first used

> foo <- function(x) {
+     x[(x %%2 != 0) | (x %% 3 != 0) | (x %% 7 != 0)]
+ }
> foo(1:100)
 [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
[20]  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38
[39]  39  40  41  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58
[58]  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77
[77]  78  79  80  81  82  83  85  86  87  88  89  90  91  92  93  94  95  96  97
[96]  98  99 100

2
请注意,您的代码之前已经删除了开头行的字符。否则,帮助您的人将承担这样做的负担。您能否清理一下您的代码(从开头行中删除 >+)? - Tyler Rinker
2个回答

3
您需要使用 "and" 运算符 & 而非 "or" 运算符 |。此外,您无需循环,可以利用 R 的向量化功能。
foo <- function(x) {
    x[(x %% 2 != 0) & (x %% 3 != 0) & (x %% 7 != 0)]
}
foo(1:50)
# [1]  1  5 11 13 17 19 23 25 29 31 37 41 43 47

你可以不用编写函数来完成这个任务。
x <- 1:50
x[(x %% 2 != 0) & (x %% 3 != 0) & (x %% 7 != 0)]
# [1]  1  5 11 13 17 19 23 25 29 31 37 41 43 47

非常感谢!但问题中写的是2、3或7。然后当我使用它时,它仍然给出了foo(1:100)的值集合。 - Faithhhhhh
如果你想要那些不能被2、3或7整除的数字,那么你应该使用&。它的意思是"不能被2整除且不能被3整除且不能被7整除"。 - Rich Scriven
我明白了!那就是德摩根定律的内容!非常感谢您,Richard先生!非常感谢! - Faithhhhhh

3

已经有一个向量化的解决方案,这是更好的选择,但我认为构建一个实际运行的循环也是有用的。您初始化了一个循环长度值k,但从1:x循环而没有使用它。这是第一个基本错误(除了使用"|"而不是"&"的错误已经被指出)。另一个错误是没有保留有效结果的累加器,可以在运行循环后返回它们。第三个逻辑错误是测试循环索引的值而不是x的值:

function2=function(x){
    k=length(x); val <- c()
    for(i in 1:k){    # probably should have used seq_along(x), and skip 'k'
         if(!( x[i]%%2==0 | x[1]%%3==0 | x[i]%%7==0)){  # could have used `"||"`
                       val <- c(val,x[i])            }
                 }
     return (val)     }  # don't need the return(), could just evaluate `val`

 x<-(1:100)
 function2(1:100)
[1]  1  3  5  9 11 13 15 17 19 23 25 27 29 31 33 37 39 41 43 45 47 51 53 55 57 59
[27] 61 65 67 69 71 73 75 79 81 83 85 87 89 93 95 97 99

注意,return x[i] 中还有一个错误。没有括号。 - Rich Scriven
好的。现在他有了你的正确示例和我的“Fortran”代码,但至少我添加了一个补充逻辑测试。我看到勾选和点赞的组合让你的答案浮动到了它应该在的顶部。 - IRTFM
非常感谢你们的帮助,没有你们我就无法解决我的问题了!我真的非常感激!(: - Faithhhhhh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接