如何修复我的函数实现插值

时间:2016-06-02 14:58:31

标签: r function interpolation

我试图制作如下所示的插值函数

让我们假设so和op是像

这样的值
so <- seq(1,10, by=1)
op <- seq(10,20, by=1)



  myopt <- function(so, op) {
  # here I make two empty 
  ff <- c() # creates an empty df
  rr <- c() # creates an empty df
  fff <- c()
  inter = round(so[1]); # interpolation
  sid = round(so[2]); # sideways movement
  # if the lenght ff is bigger than 0
  library(pracma)
  if (length(ff) > 0){
    # then the step is 
    step <- (length(ff)+ inter)/(length(rr))
    fff <- interp1(ff,seq(1,length(ff), by=step))
  }  
  if (length(fff) >= length(rr)){
    fff = fff[1:length(rr)]
  } else {
    if (length(fff) < length(rr)){
      diff = length(rr)-length(fff)
      fff = c(fff,ones(1,diff)*ff(length(ff)))
    }
  }
  if (length(fff) > 0){
    if (sid > 0){
      mysid = ones(1,sid)*fff(1)
      ffff = c(mysid, fff[1:(length(fff) - sid)]);
    } else {
      if (sid <= 0) {
        sid = abs(sid);
        mysid = ones(1,sid)*ff(length(ff));
        ffff = c(fff[(sid+1):length(fff)], mysid);
      }
    }
  }
  # normalizing and scaling
  rrs <- (Re(rr)/max(Re(rr)))   
  fffs <- (Re(ffff)/max(Re(ffff)))
  # evaluation by correlation coefficient 
  if ((norm(rrs-mean(rrs)))* (norm(ffs-meas(ffs)))==0) {
    cc <- -1e10 
  } else {
    cc =((rrs-mean(rrs))*t((ffs-meas(ffs))))/((norm(rrs-mean(rrs)))*(norm(fffs-mean(fffs))))
  }
  return(cc)
}

错误说

Error in myopt(sol, op) : could not find function "off"

然而

  • fff不是函数,而是在if语句中;怎么了?
  • 代码甚至不应该去那里,因为 ff 是一个空的数据框。问题出在哪儿?

3 个答案:

答案 0 :(得分:2)

  

fff不是函数,而是在if语句中;怎么了?

这里有一个错误。你应该改变这一行:

fff = fff(1:length(rr))

fff = fff[1:length(rr)]

注意子集的方式。括号()表示功能。

  

代码甚至不应该去那里,因为ff是一个空的数据框。问题出在哪儿?

首先,ff不是空数据框,而是空矢量。

其次,该计划将进入该行。

  if (length(ff) > 0){
    # then the step is 
    step <- (length(ff)+ inter)/(length(rr))
    fff <- interp1(ff,seq(1,length(ff), by=step))
  }  

以上屏蔽为if length(ff) > 0语句。致电fff = fff[1:length(rr)]在此区块之外,但在if(length(fff) >= length(rr))内。此评估为TRUE,因为length(fff) = 0length(rr) = 0。如果你真的认为程序不应该到达这一行,那么你的函数写错了。

您的新问题:

  ff <- c() # creates an empty df
  rr <- c() # creates an empty df
  fff <- c()  ## add this line

这部分代码:

  if (length(ff) > 0){
    # then the step is 
    step <- (length(ff)+ inter)/(length(rr))
    fff <- interp1(ff,seq(1,length(ff), by=step))
  }

是有条件的。如果未运行,则没有定义fff变量。然后会出现以下问题:

if (length(fff) >= length(rr))

答案 1 :(得分:2)

NIK,

错误在第16行。fff = fff(1:length(rr))

您的代码将fff作为函数调用。我希望这有助于指出错误。

尝试trace(myopt(so,op))

因此,

 fff = fff[1:length(rr)]

调试R

查看有关调试R的以下信息,这有望在将来使用。

RStudio调试

以下是如何在RStudio中进行调试的示例。加载代码,然后加载console类型trace(myopt(so,op))

现在我们看到了错误

> trace(myopt(so,op))
Error in myopt(so, op) : could not find function "fff"
Called from: myopt(so, op)
Browse[1]>

我们对代码进行了更改......

fff = fff[1:length(rr)]

请注意,在重新运行之前必须重新加载该函数,因为函数定义已更改...

myopt <- function(so, op) {
+   # here I make two empty 
+   ff <- c() # creates an empty df
+   rr <- c() # creates an empty df
+   fff <-c()
+   inter = round(so[1]); # interpolation
+   sid = round(so[2]); # sideways movement
+   # if the lenght ff is bigger than 0
+   library(pracma)
+   if (length(ff) > 0){
+     # then the step is 
+     step <- (length(ff)+ inter)/(length(rr))
+     fff <- interp1(ff,seq(1,length(ff), by=step))
+   }  
+   if (length(fff) >= length(rr)){
+     fff = fff[1:length(rr)]
+   } else {
+     if (length(fff) < length(rr)){
+       diff = length(rr)-length(fff)
+       fff = c(fff,ones(1,diff) * ff(length(ff)))
+     }
+   }
+ }
> myopt(so, op)
> 

enter image description here

答案 2 :(得分:0)

fff[1:length(rr)]声明中尝试fff(1:length(rr))而不是if else