2014-09-21 102 views
3

我想寫,顯示了矢量誰只會顯示誰由2,3是不可分的元素的代碼,或7[R編程幫助編寫函數

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

信仰通知,開始線上線字符從你的代碼中刪除之前。否則,這樣做的負擔就是幫助你。你能清理你的代碼嗎(從開始行刪除'>'和'+')? – 2014-09-21 18:02:02

回答

3

你想要的 「和」 運營商&而不是 「或」 |。而且,不需要循環,您可以利用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 
+0

非常感謝!但是這個問題寫了2,3或7,然後當我使用它時,它仍然給我foo(1:100)一組值frm 1:100 TT – 2014-09-21 17:33:53

+0

如果你想要的數字不能被2,3,或7,那麼你應該使用'&'這將是「不能被2整除,不能被3整除,不能被7整除」 – 2014-09-21 17:35:30

+0

我現在明白了!這與摩根法則有關!非常感謝理查德先生! merci beaucoup !!! – 2014-09-21 17:37:50

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 
+0

請注意'return x [i]'還有另一個錯誤。沒有括號 – 2014-09-21 17:40:34

+0

沒錯。現在他有你的正確範例和我的「Fortran」代碼,但至少我添加了一個互補的邏輯測試。我看到複選標記和增值組合讓您的答案浮到它所屬的頂部。 – 2014-09-21 17:42:31

+0

非常感謝!沒有你們的幫助,我不會設法解決我的問題!對此,我真的非常感激! (: – 2014-09-21 17:47:29