【发布时间】:2022-01-11 22:21:41
【问题描述】:
我不知道描述这个的正确方式,所以请多多包涵。基本上,我在 R 中有一个函数,它可以读取数据框并按特定顺序粘贴内容——它用于为 LaTeX 编写 tex 文件,因此我可以非常快速地制作数百个标签。
我附上了一个只有 for 循环的简化版本。我希望做的是让代码循环遍历四行数据,为第五行做一些不同的事情,然后返回接下来的四行数据。在下面的示例中,它将为大多数行粘贴一个短语,而在第五行它将粘贴其他内容——每个都基于数据框。
对于我的实际代码,我想水平翻转标签以尽可能多地使用纸张。见附图。,但实际上这一切都归结为我认为的 for 循环。
data <- data.frame(title = c("big Cactus", "little cactus", "bad cactus", "skinny cactus",
"round cactus", "spiny cactus", "twisty cactus", "bizarre cactus"),
name = c("Franklin", "Stephanie", "Megan", "Mark",
"Patricia", "KD", "Claude", "Audrey"),
needs = c("nothing", "some love", "too much", "some water",
"some sunlight", "new soil", "transplanted", "a friend"))
for (this.label in 1:dim(data)[1]) {
#main function I want for every label
line <- paste0(data$name[this.label], " the ", data$title[this.label], " needs ", data$needs[this.label])
print(line)
}
example of alternate function for every fourth row of the data frame:
line <- paste0(data$name[this.label], " is feeling left out!")
【问题讨论】:
-
在您的
for循环中,只需使用模运算符%%测试您的索引this.label,如下所示:if(this.label %% 5 == 0){execute alternate function} else {execute main function}。假设您从1开始计数,那么此测试将每五个循环评估为TRUE(对于this.label∈ {5,10,15,...}),因此执行备用“功能”(代码)。 -
@Dion 虽然
*apply()系列会构成更好的做法,但我不确定它是否允许访问迭代索引,那么是否有办法区分每五行? -
@Dion 无需深入研究源代码,您在
if语句中测试的索引变量的名称是什么? -
@Dion 哦,对不起。我以为你的意思是在
data.frame本身上使用*apply()。在这种情况下,我认为*apply()函数的这种用法只会使事情复杂化。 -
@Greg 好像是you are right。不知道,谢谢!