[R] Beginners problem

Liaw, Andy andy_liaw at merck.com
Mon Oct 4 17:00:55 CEST 2004


[Please try to make sure the code you posted contains no syntax error.]

Try:

> rktest <- function(){
+     rk4 <- function(x,y,f,h) {
+         n  <- length(y)
+         hh <- h*0.5
+         k1 <- f(x,y)
+         k2 <- f(x,y+k1*hh)
+         k3 <- f(x,y+k2*hh)
+         k4 <- f(x,y+k3*h)
+         y <<- y + h/6.0*(k1 + 2.0*k2 + 2.0*k3 + k4)
+     }
+     y <- 1.0
+     x <- 0.0
+     h <- 0.1
+     for(i in 1:10) {
+         rk4(x,y,rkf,h)
+         print(y)
+     }
+ }
> 
> rktest()
[1] 0.9048375
[1] 0.8187309
[1] 0.7408184
[1] 0.6703203
[1] 0.6065309
[1] 0.5488119
[1] 0.4965856
[1] 0.4493293
[1] 0.40657
[1] 0.3678798

You expected `y' in rktest() to be modified by the super-assignment, which
is incorrect.  In your version, you'll find the super-assignment creating
`y' in the global environment, rather than modifying the copy in rktest().
The reason is that the order variables are looked up in rk4() is:

1. within rk4()
2. where rk4() is defined
3. if 2 above is a function, where that function is defined
...
eventually: the global environment

BTW, I'm not sure if you really meant to do 

   y <<- y + ...

because the `y' on the RHS will be the local copy (if exists).

Andy

> From: Rolf Wester
> 
> Hi,
> 
> I'm new to R and have a problem with a little test program 
> (see below). 
> Why doesn't <<- in function rk4
> assign the new value to y so that it is seen in rktest. I 
> thought that 
> <<- does exactly this. But it seems that I
> didn't get it right. I would be very appreciative for an 
> explanation of 
> that behaviour of <<-. I know how to
> write the whole thing so that it works (return the updated y 
> to rktest) 
> but I would like to learn how variable scope
> in R works.
> 
> Thanks in advance
> 
> Rolf
> 
> --------------------------------------------------------------
> --------------------------------------------------------
> 
> rk4 <- function(x,y,f,h) {
>   n  <- length(y)
>   hh <- h*0.5
>   k1 <- f(x,y)
>   k2 <- f(x,y+k1*hh)
>   k3 <- f(x,y+k2*hh)
>   k4 <- f(x,y+k3*h)
>   y <<- y + h/6.0*(k1 + 2.0*k2 + 2.0*k3 + k4))
> }
> 
> rkf <- function(x,y) {
>   -y
> }
> 
> rktest <- function(){
>   y <- 1.0
>   x <- 0.0
>   h <- 0.1
>   for(i in 1:10) {
>     rk4(x,y,rkf,h)
>     print(y)
>   }
> }
> 
> rktest()
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
> 
>




More information about the R-help mailing list