[R] Newbie on functions

Chris Jackson chris.jackson at imperial.ac.uk
Tue Nov 8 17:25:48 CET 2005


(Ted Harding) wrote:
> On 07-Nov-05 Angelo Secchi wrote:
>> 
>> Hi,
>> I'm trying to write a simple function like
>> 
>> case1 <- function (m, cov, Q, R) {
>>   theta     <- (acos(R/sqrt(Q^3)))
>>   beta      <- (-2)*sqrt(Q)*cos(theta/3)+m[1]/3
>>   rho1      <- (-2)*sqrt(Q)*cos((theta+2*pi)/3)+m[1]/3
>>   rho2     <- (-2)*sqrt(Q)*cos((theta-2*pi)/3)+m[1]/3
>>   stderrb   <-  deltamethod( ~(-2)*sqrt(Q)*cos(theta/3)+x1/3,m,cov)
>>   stderrr1  <-  deltamethod( ~(-2)*sqrt(Q)*cos((theta+2*pi)/3)+x1/3, m,
>> cov) stderrr2  <-  deltamethod( ~(-2)*sqrt(Q)*cos((theta-2*pi)/3)+x1/3,
>> m, cov) stderr    <- c(stderrb,stderrr1,stderrr2)
>>   results   <- c(beta,rho1,rho2,stderr)
>>   results2  <- t(results)
>>   results2
>> }
>> 
>> When I call the function in an IF statement like
>> 
>> if (Q^3>R^2) results2 <- case1() else print('ciccio')
>> 
>> I get 
>> 
>> Error in eval(expr, envir, enclos) : Object "theta" not found
>> 
>> I do not understand why, any help?
> 
> Because when the function 'case1' is called as "case1()" it
> has no information on the values of m, cov, Q and R since
> it only looks in its argument list for these values (and
> not in the environment from which you called it).

In that case the error message would be something like "Argument m is
missing, with no default".

But in this case it looks like the "eval" error message is from within
the deltamethod() function from my CRAN package msm.  Unfortunately, a
limitation of this function is that user-defined variables are not
visible in the first "formula" argument.  I should make the
documentation clearer.

You could work around this as follows.  Build a string from the
values of Q and theta using sprintf(), then convert it into a
formula to pass to deltamethod():

form <- sprintf("~(-2)*sqrt(%f)*cos(%f/3)+x1/3", Q, theta)
stderrb <- deltamethod(as.formula(form), m, cov)

Mail me off list if you want any further help, as this is quite
specialised.

Chris

-- 
Christopher Jackson <chris.jackson at imperial.ac.uk>, Research Associate,
Department of Epidemiology and Public Health, Imperial College
School of Medicine, Norfolk Place, London W2 1PG




More information about the R-help mailing list