为什么这可以作为for循环而不在函数中使用?

时间:2019-10-12 16:12:00

标签: r

我正在尝试编写一个函数,该函数标识数字矢量中的数字是奇数还是偶数。数值向量的长度为1000。

我知道for循环可以正常工作,我只是想以采用任意长度向量的函数的形式来概括它

out<-vector()
f3<- function(arg){
  for(i in 1:length(arg)){
    if((arg[i]%%2==0)==TRUE){
      out[i]<-1
    }else{out[i]<-0
    }
  }
}

但是,在函数中运行时,它仅返回NULL。为什么会这样,或者我该怎么做才能将任何数字矢量泛化为函数?

2 个答案:

答案 0 :(得分:1)

正如PKumar在评论中所提到的:函数不返回任何内容,这意味着向量out仅存在于函数的环境中。

要更改此设置,可以在函数末尾添加return(out)。而且,您还应该在循环之前创建out来开始您的功能。因此您的功能如下所示。

请注意,我假设您要将某个长度的向量传递给您的函数,结果得到一个长度相同的向量,其中包含1代表偶数,0代表奇数。 f3(c(1,1,2))将返回0 0 1

f3 <- function(arg){

  out <- vector(length = length(arg), mode = "integer")

  for(i in 1:length(arg)){

    if((arg[i]%%2==0)==TRUE){ # note that arg[i]%%2==0 will suffice
      out[i]<-1
    } else {out[i]<-0
    }
  }

  return(out) # calling out without return is enough and more inline with the tidyverse style guide
}

但是,正如塞巴斯蒂安(Sebastiann)在评论中指出的那样,some_vector %% 2产生的结果几乎相同。区别在于,奇数产生1,偶数产生0。您也可以将其放入函数中,并从arg中减去1以反转01

f3 <- function(arg){
  (arg-1) %% 2
}

答案 1 :(得分:0)

关于您的代码的几点注意事项:

  1. 一个函数必须返回一些东西
  2. 逻辑if((arg [i] %% 2 == 0)== TRUE)是多余的。 if(arg [i] %% 2 == 0)就足够了,但是错了,因为arg [i]不存在。
  3. length(arg)是length(1000),如果运行则返回1 您应该使用i更改arg [i]并将所有1:1000的值分配给i,如下所示:

R

out <-vector()
f3 <- function(arg){
  for(i in 1:arg){
    if(arg[i] %% 2 == 0){
      out[i] <- 1
      }
    else{
      out[i] <- 0
    }
  }
  return(out)
}
f3(1000)