R-多循环计数器变量

R-多循环计数器变量,r,for-loop,R,For Loop,我需要编写循环,其中每个迭代都有一组唯一的变量值。它不是一个嵌套循环,用于每个i-do和每个j-do类型的问题。下面只是一个示例问题,循环正在做什么并不重要,它能够为循环的每次迭代使用多个变量 简单循环: df <- data.frame(num = 1:5) lookup <- data.frame(colors = c("red", "green", "blue"), pets = c("cat", "dog", "rabbit"),

我需要编写循环,其中每个迭代都有一组唯一的变量值。它不是一个嵌套循环,用于每个i-do和每个j-do类型的问题。下面只是一个示例问题,循环正在做什么并不重要,它能够为循环的每次迭代使用多个变量

简单循环:

df <- data.frame(num = 1:5)
lookup <- data.frame(colors = c("red", "green", "blue"), 
                     pets = c("cat", "dog", "rabbit"),
                     stringsAsFactors = FALSE)
for (color in lookup$colors) {
  df[, color] <- 1
}
我想做的是伪代码:

for (color, pet in lookup$colors, lookup$pets) {
  df[, color] <- pet
}
我提出的最佳方法如下,但额外的r[]使代码更难阅读:

for (i in 1:nrow(lookup)) {
  r <- unlist(lookup[i, ])
  df[, r["colors"]] <- r["pets"]
}

df
  num red green   blue
1   1 cat   dog rabbit
2   2 cat   dog rabbit
3   3 cat   dog rabbit
4   4 cat   dog rabbit
5   5 cat   dog rabbit

我想知道解决这类问题的最佳通用方法是什么。在许多情况下,您可以使用一个函数来替换循环,以便为每一组变量调用该函数,但函数在某些情况下并不适用。

对于您的特定示例,您的思维方式是正确的。为了稍微清理一下并减少出现bug的机会,您可以将循环重写为:

for (i in seq_len(nrow(lookup))) {
  color_i <- lookup[i, "colors"]
  pet_i <- lookup[i, "pets"]
  df[[color_i]] <- pet_i
}
切向相关 我要说的是,您的示例是R中的一个特例,您迭代地修改现有对象。大多数时候,人们只想迭代多个向量,并将结果存储在一个新的向量中。例如:

results <- list()

for (i in seq_len(nrow(lookup))) {
  color_i <- lookup[i, "colors"]
  pet_i <- lookup[i, "pets"]
  results[[i]] <- do_something(color_i, pet_i)
}

你想要df[lookup$colors]我不知道这是怎么回事?它不适合我。但我正在寻找一种可推广的方法——这似乎不是。根据你的例子,它对我很有效,而且也是可推广的,尽管不清楚你是想用相应的“宠物”填充“颜色”列,这是什么样的推广?你能展示你的预期输出吗,但这只是一个可能误导的例子。我正在寻找在循环中使用多个变量的最佳方法。使用您可以执行的函数:myfunc感谢您的回答-在开始时按照您的建议将查找值保存到var在某些情况下肯定会有所帮助,但是如果有许多var,每个var在下面的代码中只使用一次,这将非常混乱。使用apply和assign做一些事情可能会有所帮助,但我认为这会变得太复杂。我在问题中已经澄清,我感兴趣的不是我示例中的特定代码,而是在每个循环迭代中使用多个变量的一般想法。然后我建议将for循环体更改为函数并使用mapply。如有必要,可以使用更改函数外部的值
results <- list()

for (i in seq_len(nrow(lookup))) {
  color_i <- lookup[i, "colors"]
  pet_i <- lookup[i, "pets"]
  results[[i]] <- do_something(color_i, pet_i)
}
results <- mapply(FUN = do_something, lookup[["colors"]], lookup[["pets"]])