[R] How to vectorize this function

Jeff Newmiller jdnewm|| @end|ng |rom dcn@d@v|@@c@@u@
Fri Sep 21 00:04:21 CEST 2018


Sorry, misread your comment, I agree. 4/2 has one arithmetic operation, (1/2)*4 has two to accomplish the same calculation.

On September 20, 2018 1:53:03 PM PDT, "MacQueen, Don" <macqueen1 using llnl.gov> wrote:
>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.
>    

-- 
Sent from my phone. Please excuse my brevity.




More information about the R-help mailing list