[R] How to vectorize this function

MacQueen, Don m@cqueen1 @end|ng |rom ||n|@gov
Thu Sep 20 22:53:03 CEST 2018


You're asking me?

I prefer
> 4/2
[1] 2

not
> 1/2*4
[1] 2

(I think that's what I said)

And if I did want to multiply by the reciprocal, which does happen from time to time, I'd certainly do it this way:
   (1/2)*4

-Don

--
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, 12:36 PM, "Jeff Newmiller" <jdnewmil using dcn.davis.ca.us> wrote:

    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 using 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-bounces using r-project.org on behalf of momtoomax using 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 using 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 using 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.
    



More information about the R-help mailing list