如何在函数中插入“ for in”循环?

时间:2019-07-27 03:51:38

标签: r loops

我学会了functionfor in循环,并且试图将循环注入到函数中,以便可以方便地使用循环或在另一个循环中注入循环。 但这是行不通的。

我将向您显示代码。

for(year in c(2016:2018)){x<-c(x,paste("tax",year))}

以此,我成功地制作了[tax 2016, tax 2017, tax 2018]的序列。

此外,我正在尝试创建一个可以轻松产生[tax 2016, tax 2017, tax 2018, tax 2019, ...]

的函数

所以我写了这样的代码

F=function(a){for(year in c(2016:a)){x<-c(x,paste("tax",year))}}

然后

y=F(2020)

,但值“ y”却是 [NULL(empty)]

出什么问题了?在函数中注入循环是不可能的吗?还是还有其他键?

-

1 个答案:

答案 0 :(得分:2)

您的代码的一些建议:

  • 错误:您永远不会在函数中定义x,因此它必须是在函数外部找到x,这通常是一件坏事(而且很难解决,因为找出来);快速的变通办法是在x <- c()循环之前定义x <- character(0)或以更具“声明性”的方式定义for
  • AndyBarbour指出的问题(尽管不是错误):for循环什么也不返回,因此您的函数也什么也不返回。您需要return一些东西。
  • 速度/代码效率:不需要for循环,请尝试paste("tax", 2016:2018);
  • 编程:假设主叫用户是邪恶的或犯了很多错误,您可能想在编程中学会防御。您期望F(2)发生什么?它应该返回递减的"tax 2016", "tax 2015", "tax 2014", ..., "tax 3", "tax 2"吗?
  • 编程:对函数中的常量进行硬编码可能太过局限,您可以在函数声明中为起点提供一个可选参数,例如F <- function(a, start = 2016L);
  • 样式:c中不需要c(2016:a),只需执行2016:a,即可在此处添加任何内容。

请记住以下相同功能的不同变体

F <- function(yr, start = 2016L) {
  if (yr >= start) return(paste("tax", start:yr))
  return(character(0))
}
F <- function(yr) start = 2016L) {
  x <- character(0)
  if (y >= start) {
    for (y in yr:start) x <- c(x, paste("tax", y))
  }
  return(x)
}