For循环只返回R中的最后一个值

For循环只返回R中的最后一个值,r,for-loop,R,For Loop,我在R中构造了一个for循环,但它只返回最后一个值。比如说 asd <- c(0) for (i in c(1,5)) { asd <- HTML("<tr> <td> '+d[",i,"]+' </td> <td>' + d[",i+1,"] + '</td> <td>' + d[",i+

我在R中构造了一个for循环,但它只返回最后一个值。比如说

asd <- c(0)
for (i in c(1,5)) {
  asd <- HTML("<tr>
          <td> '+d[",i,"]+' </td>
          <td>' + d[",i+1,"] + '</td>
          <td>' + d[",i+2,"] + '</td>
          <td>' + d[",i+3,"] + '</td>
          </tr>")
}

asd这将生成您的预期输出

asd <- purrr::map_chr(c(1L,5L), ~ {
  paste0("<tr>",
          purrr::map_chr(seq(.x,.x + 3,1), ~ {
            glue::glue("<td>' + d[{.x}] + '</td>")
          }) %>% str_c(collapse = "")
         ,
         "</tr>")
})
asd
[1] "<tr><td>' + d[1] + '</td><td>' + d[2] + '</td><td>' + d[3] + '</td><td>' + d[4] + '</td></tr>"
[2] "<tr><td>' + d[5] + '</td><td>' + d[6] + '</td><td>' + d[7] + '</td><td>' + d[8] + '</td></tr>"
asd%str_c(collapse=”“)
,
"")
})
自闭症
[1] “'+d[1]+'+d[2]+'+d[3]+'+d[4]+'”
[2] “'+d[5]+'+d[6]+'+d[7]+'+d[8]+'”

当然,对于
循环,可以有基于
的解决方案,但我认为,如果您使用的是R,那么学习使用apply/map函数是值得的。

这将生成您预期的输出

asd <- purrr::map_chr(c(1L,5L), ~ {
  paste0("<tr>",
          purrr::map_chr(seq(.x,.x + 3,1), ~ {
            glue::glue("<td>' + d[{.x}] + '</td>")
          }) %>% str_c(collapse = "")
         ,
         "</tr>")
})
asd
[1] "<tr><td>' + d[1] + '</td><td>' + d[2] + '</td><td>' + d[3] + '</td><td>' + d[4] + '</td></tr>"
[2] "<tr><td>' + d[5] + '</td><td>' + d[6] + '</td><td>' + d[7] + '</td><td>' + d[8] + '</td></tr>"
asd%str_c(collapse=”“)
,
"")
})
自闭症
[1] “'+d[1]+'+d[2]+'+d[3]+'+d[4]+'”
[2] “'+d[5]+'+d[6]+'+d[7]+'+d[8]+'”

当然也有基于
for
循环的解决方案,但我认为如果您使用的是R,那么学习使用apply/map函数是值得的。

A
for
循环从根本上来说并不适合这项任务(特别是在R中,但也更普遍)

但首先,循环中的单个条目是错误的,因为您没有读取
d
;还不完全清楚您的代码实际上在做什么(您没有告诉我们
HTML
函数来自何处;我假设它来自“htmltools”)

您可能希望使用
paste0
来连接值,否则会得到不必要的空白。因此,要生成HTML表的一列,您可以使用

paste0('<td>', d[i], '</td>')
这将创建一个由四个字符串组成的向量。但是我们想要一个字符串。我们可以告诉
paste0
使用
collapse
参数折叠四个元素;我们指定分隔符:

cols = paste0('<td>', d[seq(i, i + 4)], '</td>', collapse = '\n')
好的,就这样一排了。现在我们需要对所有行执行此操作。但在R中,你不会使用循环来实现这一点;相反,您将使用
*apply
函数

你不能像以前那样对数字进行迭代。这将导致每行重复重叠索引的输出:


1 2 3 4
2 3 4 5
…
…很确定那不是你想要的。相反,您希望将输入数据分成4组。以智能的方式执行此操作有点棘手,但函数
split
在这方面对我们有所帮助

首先,我们沿着
d
生成索引,但从0(0,1,2,3,…)开始:

接下来,我们使用整数除(
%/%
)4将这些索引转换为组标识符:

groups = idx %/% 4L
现在
groups
的值为
c(0,0,0,0,1,1,1,1,1,2,…)
。换句话说:前4个元素为0,后4个元素为1,依此类推。这允许我们将
d
中的数据分成4个连续的组,然后我们依次对每个组应用上述操作:

rows = lapply(
    split(d, groups),
    function (x) {
        cols = paste0('<td>', x[1 : 4], '</td>', collapse = '\n')
        HTML('<tr>', cols, '</tr>')
    }
)

for
循环基本上不适合此任务(特别是在R中,但更一般而言)

但首先,循环中的单个条目是错误的,因为您没有读取
d
;还不完全清楚您的代码实际上在做什么(您没有告诉我们
HTML
函数来自何处;我假设它来自“htmltools”)

您可能希望使用
paste0
来连接值,否则会得到不必要的空白。因此,要生成HTML表的一列,您可以使用

paste0('<td>', d[i], '</td>')
这将创建一个由四个字符串组成的向量。但是我们想要一个字符串。我们可以告诉
paste0
使用
collapse
参数折叠四个元素;我们指定分隔符:

cols = paste0('<td>', d[seq(i, i + 4)], '</td>', collapse = '\n')
好的,就这样一排了。现在我们需要对所有行执行此操作。但在R中,你不会使用循环来实现这一点;相反,您将使用
*apply
函数

你不能像以前那样对数字进行迭代。这将导致每行重复重叠索引的输出:


1 2 3 4
2 3 4 5
…
…很确定那不是你想要的。相反,您希望将输入数据分成4组。以智能的方式执行此操作有点棘手,但函数
split
在这方面对我们有所帮助

首先,我们沿着
d
生成索引,但从0(0,1,2,3,…)开始:

接下来,我们使用整数除(
%/%
)4将这些索引转换为组标识符:

groups = idx %/% 4L
现在
groups
的值为
c(0,0,0,0,1,1,1,1,1,2,…)
。换句话说:前4个元素为0,后4个元素为1,依此类推。这允许我们将
d
中的数据分成4个连续的组,然后我们依次对每个组应用上述操作:

rows = lapply(
    split(d, groups),
    function (x) {
        cols = paste0('<td>', x[1 : 4], '</td>', collapse = '\n')
        HTML('<tr>', cols, '</tr>')
    }
)

在循环的每次迭代中,您都会覆盖
asd
。尝试将每个加法添加到
asd的当前值中,或将每个加法写入向量的新元素中,即列表和循环后的关联。或者在循环的每次迭代结束时打印/输出
asd
。尝试:
paste0(“+d[”,1:8,“]+”,collapse=“”)
抱歉,伙计们,没能理解。您能帮我粘贴值吗?在循环的每次迭代中,您都在覆盖
asd
。尝试将每个加法添加到
asd的当前值中,或将每个加法写入向量的新元素中,即列表和循环后的关联。或者在循环的每次迭代结束时打印/输出
asd
。尝试:
paste0(“+d[”,1:8,“]+”,collapse=“”)
抱歉,伙计们,没能理解。你能帮我粘贴值吗?谢谢。但在这之后,我需要取出变量并在其他地方使用它。例如
purrr::map_chr(c(1L,5L),{asd%str_c(collapse=“”),“)}
这样我就可以使用“asd”作为变量,只需将表达式指定给asd:
asd非常感谢。但是预期的输出是`+d[1]+'
html = Reduce(HTML, rows)