re: your last comment... why do you prefer to multiply by the reciprocal? On September 20, 2018 10:56:22 AM PDT, "MacQueen, Don via R-help" <r-help@r-project.org> wrote: >In addition to what the other said, if callM is a vector then an >expression of the form > if (callM <= call0) >is inappropriate. Objects inside the parentheses of if() should have >length one. For example, > >> if (1:5 < 3) 'a' else 'b' >[1] "a" >Warning message: >In if (1:5 < 3) "a" else "b" : > the condition has length > 1 and only the first element will be used > > >instead of what you have: > if(callM <= call0){ > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > >Here are a couple of (untested) possibilities: > > M.gt.0 <- callM > call0 > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > sig[M.gt.0] <- (1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)))[M.gt.0] > >or > >sig <- 1/sqrt(T)*(sqrt(gamma + y) + ifelse(callM <= call0, -1, 1) * >sqrt(gamma - y)) > >incidentally, I would write > sig <- (sqrt(gamma + y) - sqrt(gamma - y))/sqrt(T) >instead of > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > >-- >Don MacQueen >Lawrence Livermore National Laboratory >7000 East Ave., L-627 >Livermore, CA 94550 >925-423-1062 >Lab cell 925-724-7509 > > > >On 9/20/18, 8:08 AM, "R-help on behalf of Lynette Chang" ><r-help-boun...@r-project.org on behalf of momtoo...@gmail.com> wrote: > > Hello everyone, > > I’ve a function with five input argument and one output number. > impVolC <- function(callM, K, T, F, r) > >I hope this function can take five vectors as input, then return one >vector as output. My vectorization ran into problems with the nested >if-else operation. As a result, I have to write another for loop to >call this function. Can anyone suggest some methods to overcome it? I >put my code below, thanks. > > impVolC <- function(callM, K, T, F, r){ > > > if(y >= 0){ > call0 <- K*exp(-r*T)*(exp(y)*polya(sqrt(2*y)) - 0.5) > if(callM <= call0){ > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > }else{ > call0 <- K*exp(-r*T)*(exp(y)/2 - polya(-sqrt(-2*y))) > if(callM <= call0){ > sig <- 1/sqrt(T)*(-sqrt(gamma + y) + sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > } > sig > } > > for(i in 1:length(call)){ >sigV[i] <- impVolC(callM = call[i], K = df$Strike[i], T = T, F = F, r = >r_m) > } > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. > > >______________________________________________ >R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.
-- Sent from my phone. Please excuse my brevity. ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.