0

我生成了以下函数,它根据输入值的范围执行操作:

foof <- function(height,age){

# we have a choice of two methods to use
# initially set both methods to false
SS = FALSE; # method 1
TT = FALSE; # method 2

# set range for values 
H_rng <- c(0.5,20) # height range
A_rng <- c(0,60) # age range


# check to see if all values lie within the ranges specified
if (isTRUE(all(height<H_rng[1]))){
  SS <- TRUE # use method 1
} else if(!(sum(age<A_rng[1])||sum(age>A_rng[2])) && !(sum(height<H_rng[1]))||sum(height>H_rng[2])){
  TT <- TRUE # use method 2
}


if (SS == TRUE){
  Vals <- SS+TT
}

if (TT == TRUE){
  Vals <- SS-TT
}

return(Vals)

}

其中用于特定计算的方程取决于输入数组的值。该函数基本上查看输入参数中的所有值,然后如果所有这些值都在指定的范围内,它使用显示的方程来计算答案。但是,我想知道如何更改它以查看输入变量中的每个单独的值,然后使用正确的方程。这很难用语言描述,所以我举个例子:

height <- c(0,0,0,0,0,0,0,0)
height <- matrix(height,nrow = 2)

age <- c(18,9,22,3,4,6,7,32)
age <- matrix(age,nrow = 2)

f <- foof(height,age)

这很好用,因为所有“高度”都低于 H_rng,因此它使用了方法 1。

如果我将其更改为

height <- c(0,0,0,0,0,0,2,0)
height <- matrix(height,nrow = 2)

age <- c(18,9,22,3,4,6,7,32)
age <- matrix(age,nrow = 2)

f <- foof(height,age)

该函数不会返回任何输出,这是因为高度中的所有值都不小于 H_rng。

因此,我需要在我的函数末尾添加类似循环的内容,如果 SS 和 TT 都为假,那么我们分别查看身高和年龄的每个条目并返回数组中的值。我试图通过以下方式做到这一点:

foof <- function(height,age){

# initially set both methods to false
SS = FALSE; # method 1
TT = FALSE; # method 2

# set range for values 
H_rng <- c(0.5,20) # height range
A_rng <- c(0,60) # age range


# check to see if all values lie within the ranges specified
if (isTRUE(all(height<H_rng[1]))){
  SS <- TRUE # use method 1
} else if(!(sum(age<A_rng[1])||sum(age>A_rng[2])) && !(sum(height<H_rng[1]))||sum(height>H_rng[2])){
  TT <- TRUE # use method 2
}

if (SS == TRUE){
  Vals <- SS+TT
}

if (TT == TRUE){
  Vals <- SS-TT
}

if (SS == FALSE && TT == FALSE){
  Vals <- 0
  for (i in 1:length(height)){
    Vals[i] <- foof(height[i],age[i])
  }     
}

return(Vals)

这会生成一个输出,但它与输入变量的维度不同,例如这里它是一个向量,而输入变量是一个矩阵。我将如何解决这个问题?

4

1 回答 1

1

例如,您可以在最后一行之前添加此行:

.....
dim(Vals) <- dim(height)
return(Vals)
于 2013-04-17T08:24:43.843 回答