在函数中使用向量索引

时间:2014-06-12 19:15:11

标签: r vector

尝试创建一个函数,生成累积热量单位所需的天数列表/向量。

Day<-c(1:10)
min1<-c(0.70,1.45,2.22,2.98,3.75,4.50,5.02,5.34,5.61,5.81)
data<-as.data.frame(cbind(Day,min1))

以下函数正确输出数据$ min1超过2的日期:

days.till<-function (x) min(data$Day[data$min1>=x])
days.till(2)

但如果我尝试使用多个x值,我会收到错误。

days.till(2:4)
[1] 4
Warning message:
In data$min1 >= x :
longer object length is not a multiple of shorter object length

以下策略会返回相同的错误:

days.till(c(2:4))

days.till<-function (x=2:4) min(data$Day[data$min1>=x])

我在其他更简单的函数中使用多个输入值没有问题,所以我担心函数中的向量索引会导致问题。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用sapply计算传递的向量中每个元素的所需值:

days.till <- function(x) sapply(x, function(y) min(data$Day[data$min1>=y]))
days.till(2:4)
# [1] 3 5 6

答案 1 :(得分:0)

Day<-c(1:10)
min1<-c(0.70,1.45,2.22,2.98,3.75,4.50,5.02,5.34,5.61,5.81)
mydata<-as.data.frame(cbind(Day,min1))

days.till <- function(x,data=mydata) {
  if (length(x)==1){
    return(min(data$Day[data$min1>=x]))
  } else if (length(x)>1) {
    return(lapply(x,days.till,data=data))
  }
}

## > days.till(2)
## [1] 3
## > days.till(2:4)
## [[1]]
## [1] 3

## [[2]]
## [1] 5

## [[3]]
## [1] 6

答案 2 :(得分:0)

这是您的功能的修改版本:

days.till <- function(thresh)
  with(data, Day[sapply(thresh, function(x) which(min1 >= x)[1])])

days.till(2:4) 
# [1] 3 5 6