Как включить условие if для создания непостоянной функции в R? - PullRequest
0 голосов
/ 23 сентября 2018

Нас просят написать функцию, используя функцию external для вычисления функции двойного суммирования.

Первоначально мой код был написан в следующей форме, и он работает:

funC<-function(n){
  express<-function(r,s){
    s^2/(10+4*r^3)
  }
  s<-1:n
  r<-1:n
  g<-outer(r,s,"express")
  g[row(g)< col(g)]<-0
  sum(g)
}

Однако я заметил, что эта функция будет работать очень медленно, когда я увеличу свой ввод n до большого числа, скажем, 10000.

Я думаю, это потому, что в моей программе многие вычисления избыточныот которого я должен избавиться.

Поэтому я попытался создать другую функцию express , чтобы она присваивала 0 выходным данным, если r> s.

funC<-function(n){
  express<-function(r,s){
    if(r<=s){s^2/(10+4*r^3)}
          else {0}}
  s<-1:n
  r<-1:n
  g<-outer(r,s,"express")

  sum(g)
  g
}

Однако оказывается, что этот код не работает.Вот предупреждение, которое я получил.

Предупреждающее сообщение: In, если (r <= s) {: условие имеет длину> 1, и будет использоваться только первый элемент

Я искал в интернете, но не могу найти какую-либо информацию о создании сегментированной функции ... может кто-нибудь дать мне несколько советов?Прошу прощения, если я допустил ошибки в своем коде ... Я новичок в этой программе ...

1 Ответ

0 голосов
/ 23 сентября 2018
funC<-function(n){
  express<-function(r,s){
    ifelse(r>=s,s^2/(10+4*r^3),0)}
  s<-1:n
  r<-1:n
  g<-outer(r,s,"express")

  sum(g)
  g
}

Вы думаете, outer является поэлементной функцией как для r , так и для с , что означает каждый раз, когда outer выбирает 1 элемент из r и 1 элемент из s для предложения расчета.

Однако из вашей информации о предупреждении, я думаю, outer использует вектор r и каждый элемент s для вычисления результата каждый раз. В этой ситуации, используя ifelse(testvector,yes,no), вы можете получить свой результат.Оформить заказ с помощью ?ifelse

Каждый раз, когда outer функция пытается вычислить строку вашей матрицы результатов g .Таким образом, он будет генерировать логический вектор.Поместите логический вектор в ifelse() в качестве первого параметра, а затем установите параметры yes (когда логика равна TRUE) и no .Вы получите то, что хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...