Программирование прямоугольной волны и пилообразной волны в R

Я пытаюсь построить функцию в R, которая представляет квадратные и пилообразные волны с частотой 100 Гц [0,1]. Я попробовал это:

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

Так почему же это не работает?

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 для деталей.

Я был неправ изначально, хотел обновить.

Если он не векторизован должным образом, вы не можете построить необработанную функцию и вам нужно вместо этого построить вывод функции. Простой способ сделать это с вашей конкретной функции ниже.

sequence <- seq(from = 0,to = 0.01, by = 0.00001)
plot(sapply(X = sequence,FUN = squarewave),type = "o")
Другие вопросы по тегам