# [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()
 0.9048375
 0.8187309
 0.7408184
 0.6703203
 0.6065309
 0.5488119
 0.4965856
 0.4493293
 0.40657
 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.
>
>
> 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