An iterative function

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

An iterative function

li li-13
Dear all,
  The function f() below is a function of m1 and m2, both of which are
matrices with 3 rows. The function works sequentially one row after
another.
So altogether there are three stages. I am trying to update the coding to
write a generic function that will work for arbitrary k stages.
  I am hoping to get some suggestion and help. Thanks so much!
         Hanna




 ##x, y are two vectors of the same length
f0 <- function(x, y){
  I <- which((x-y)^2>0.5)
  if (length(I)==0){
    a <- 0; b <-0; c<- 0
  } else {
  a <- min(I)
  b <- x[a]
  c <- y[a]}
  return(list(a=a, b=b, c=c))
}

##both m1 and m2 are matrix with 3 rows and same number of columns
f <- function(m1, m2){
  n <- dim(m1)[2]
  tmp1 <- f0(m1[1,], m2[1,])
  S2 <- which(m1[1,] > tmp1$a)
  if (length(S2) == 0){
    t1 <- c(tmp1$b, 0, 0)
    t2 <- c(tmp1$c, 0, 0)} else {
    tmp2 <- f0(m1[2,S2], m2[2, (n-length(S2)+1):n])
    S3 <- S2[which(m2[2, S2] > tmp2$a)]
    if (length(S3) == 0) {
      t1 <- c(tmp1$b, tmp2$b, 0)
      t2 <- c(tmp1$c, tmp2$c, 0)} else {
        tmp3 <- f0(m1[3,S3], m2[3,  (n-length(S3)+1):n])
        t1 <- c(tmp1$b, tmp2$b, tmp3$c)
        t2 <- c(tmp1$c, tmp2$c, tmp3$b)
      }}
  return(list(t1=t1, t2=t2))
}

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: An iterative function

Boris Steipe
Write a for-loop that tests your condition and carries the necessary parameters forward. break() when your condition is met.

B.




> On Oct 29, 2017, at 10:24 PM, li li <[hidden email]> wrote:
>
> Dear all,
>  The function f() below is a function of m1 and m2, both of which are
> matrices with 3 rows. The function works sequentially one row after
> another.
> So altogether there are three stages. I am trying to update the coding to
> write a generic function that will work for arbitrary k stages.
>  I am hoping to get some suggestion and help. Thanks so much!
>         Hanna
>
>
>
>
> ##x, y are two vectors of the same length
> f0 <- function(x, y){
>  I <- which((x-y)^2>0.5)
>  if (length(I)==0){
>    a <- 0; b <-0; c<- 0
>  } else {
>  a <- min(I)
>  b <- x[a]
>  c <- y[a]}
>  return(list(a=a, b=b, c=c))
> }
>
> ##both m1 and m2 are matrix with 3 rows and same number of columns
> f <- function(m1, m2){
>  n <- dim(m1)[2]
>  tmp1 <- f0(m1[1,], m2[1,])
>  S2 <- which(m1[1,] > tmp1$a)
>  if (length(S2) == 0){
>    t1 <- c(tmp1$b, 0, 0)
>    t2 <- c(tmp1$c, 0, 0)} else {
>    tmp2 <- f0(m1[2,S2], m2[2, (n-length(S2)+1):n])
>    S3 <- S2[which(m2[2, S2] > tmp2$a)]
>    if (length(S3) == 0) {
>      t1 <- c(tmp1$b, tmp2$b, 0)
>      t2 <- c(tmp1$c, tmp2$c, 0)} else {
>        tmp3 <- f0(m1[3,S3], m2[3,  (n-length(S3)+1):n])
>        t1 <- c(tmp1$b, tmp2$b, tmp3$c)
>        t2 <- c(tmp1$c, tmp2$c, tmp3$b)
>      }}
>  return(list(t1=t1, t2=t2))
> }
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] 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.

______________________________________________
[hidden email] 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.