2015-05-07 37 views
1

我想在R中建立一個函數,它代表範圍[0,1]範圍內有100Hz的正方形和鋸齒波。我嘗試這樣做:編程方波和鋸齒波在R

squarewave <- function (t) { 

    # 0.01 == 100Hz(=2Pi) -> 1 Period of the Squarewave 
    # 0.005 == Pi   -> Half Period of the Squarewave 
    # if t smaller than a half period -> 1 
    # if t greater or equal than half a period -> 0 

    if ((t %% 0.01) < 0.005) 
    return (1) 
    else if ((t %% 0.01) >= 0.005) 
    return (0) 

} 

當我嘗試繪圖使用此功能:

plot(squarewave) 

我得到以下錯誤:

> plot(squarewave) 
Error in curve(expr = x, from = from, to = to, xlim = xlim, ylab = ylab, : 
    'expr' has not been evaluated to an object of length 'n' 
In addition: Warning message: 
In if ((t%%0.01) < 0.005) return(1) else if ((t%%0.01) >= 0.005) return(0) : 
    the condition has length > 1 and only the first element will be used 

那麼,爲什麼這不是工作?

+0

用英文發表您的錯誤,而不是德文。 – Naruto

+1

當您繪製它時,您沒有將任何參數傳遞給'squarewave'。你不能直接繪製一個函數。 –

回答

2

您需要將向量化函數傳遞給plot。因此,請使用Vectorize自動執行此操作,或者使用ifelse而不是if

plot(Vectorize(squarewave)) 

squarewave2 <- function (t) { 

    # 0.01 == 100Hz(=2Pi) -> 1 Period of the Squarewave 
    # 0.005 == Pi   -> Half Period of the Squarewave 
    # if t smaller than a half period -> 1 
    # if t greater or equal than half a period -> 0 

    ifelse(((t %% 0.01) < 0.005),1,0) 
} 

plot(squarewave2) 

爲了增加plot的分辨率,使用參數n,見?curve瞭解詳情。

+0

對不起,我發現並刪除了我的評論,然後才發現你已經回答了。無論如何,我按照你的建議打開了'n',它工作的很好。我以前不知道,所以今天我從你的答案中學到了一些東西。 – TARehman

+0

這就是要點! 使用ifelse-Statement時,函數顯示爲可以繪製的矢量化函數。接下來,情節就像一個空中飛人。爲了讓情節看起來像一個真正的方波,你必須增加函數圖的n值。 感謝詹姆斯! – tbol

0

我最初錯了,想更新。

除非它是正確的矢量化,你不能繪製一個原始函數,而需要改爲繪製函數的輸出。下面是使用您的特定功能完成此操作的簡單方法。

sequence <- seq(from = 0,to = 0.01, by = 0.00001) 
plot(sapply(X = sequence,FUN = squarewave),type = "o") 
+0

這不是正確的: cos64hz < - 函數(t)的{ 返回(COS(2 * 64 * PI * t))的 } 工作很大具有: 情節(cos64hz,類型= 「L」,XLIM = c(0,1/20),ylim = c(-1,1.5),col =「blue」,ylab =「Amplitude」,xlab =「Zeit [sec]」) – tbol

+0

您是否更具體?我用它製作了一個非常漂亮的方波。 – TARehman

+0

@AlexA。寫入的函數不會接受向量作爲參數,因此使用'sapply()'來獲取向量。 – TARehman