Hello, I was trying to build some functions which I would like to integrate over an interval using the function 'integrate' from the 'stats' package. As an example, please consider the function
h(u)=sin(pi*u) + sqrt(2)*sin(pi*2*u) + sqrt(3)*sin(pi*3*u) + 2*sin(pi*4*u) Two alternative ways to 'build' this function are as in f and g below: coeff<-sqrt(1:4) zeta<-function(i) {force(i); function(u){ zeta<-sqrt(2)+sin(pi*i*u) }} f<-function(u){ f<-0 for (j in 1:4){ f<-f+coeff[j]*(zeta(j)(u)) } f<-f } g<-function(u){ g<-crossprod(coeff,zeta(1:4)(u)) } Obviously, f and g are equivalent, but in the actual code I am writing, g is much faster. However, I can't seem to integrate (neither to plot) g. In fact, these are the error messages I get: > print(f(.1)) [1] 4.443642 > print(g(.1)) [,1] [1,] 4.443642 Everything ok until here... but... When using plot(), I get this: > plot(f) #plots, as expected. > plot(g) Error in crossprod(coeff,zeta(1:4)(u)) : arguments not compatible Besides that: Warning message: In pi * i * u : longer object length is not a multiple of shorter object length When using integrate(), I get this: > integrate(f,0,1) 1.004172 with absolute error < 2.5e-13 > integrate(g,0,1) Error in crossprod(coeff,zeta(1:4)(u)) : arguments not compatible Besides that: Warning message: In pi * i * u : longer object length is not a multiple of shorter object length > I have already tried some simple 'solutions', for example to set g<-function(u){ vec1<-drop(coeff) vec2<-drop(zeta(1:4)(u)) g<-drop(crossprod(coeff,zeta(1:4)(u))) } as well as using the %*% operation, but these won't solve my problem. Any suggestions would be welcome. Thanks in advance, Eduardo Horta [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.