我试图制作如下所示的插值函数
让我们假设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
语句中;怎么了?答案 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) = 0
和length(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的以下信息,这有望在将来使用。
以下是如何在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)
>
答案 2 :(得分:0)
在fff[1:length(rr)]
声明中尝试fff(1:length(rr))
而不是if else
。