gpt4 book ai didi

r - 从 lapply 或带有 print 语句的函数调用时 kable 出现意外行为

转载 作者:行者123 更新时间:2023-12-02 02:33:53 24 4
gpt4 key购买 nike

我试图理解使用 knit 包编织 HTML 时 kable 函数的以下两个意外行为(在 Ubuntu 14.04 上的 RStudio 0.98.977 中):

  1. 当在 lapply 中两次调用 kable 时,只有第一个调用会在最终的 HTML 中产生漂亮的显示。
  2. 当从也使用 print 语句的函数内进行两次 kable 调用时,只有最后一次调用会在最终 HTML 中产生漂亮的显示。

示例代码如下:

Load library:

```{r init}
library("knitr")
```

Define dataframe:

```{r define_dataframe}
df <- data.frame(letters=c("a", "b", "c"), numbers=c(1, 2, 3))
rownames(df) <- c("x", "y", "z")
```

### Example 1: pretty display with simple call

The dataframe is displayed nicely twice when knitting HTML with the following code:

```{r pretty_display1, results="asis"}
kable(df)
kable(df)
```

### Example 2: unexpected display with lapply

The dataframe is displayed nicely only the first time when knitting HTML with the following code:

```{r unexpected_display1, results="asis"}
lst <- list(df, df)
lapply(lst, kable)
```

### Example 3: pretty display with function

The dataframe is displayed nicely twice when knitting HTML with the following code:

```{r pretty_display2, results="asis"}
foo1 <- function (df) {
kable(df)
}
foo2 <- function (df) {
foo1(df)
foo1(df)
}
foo2(df)
```

### Example 4: unexpected display with function containing print statements

The dataframe is displayed nicely only the second time when knitting HTML with the following code:

```{r unexpected_display2, results="asis"}
foo1 <- function (df) {
kable(df)
}
foo2 <- function (df) {
print("first display")
foo1(df)
print("second display")
foo1(df)
}
foo2(df)
```

您对这些奇怪的行为有何解释以及如何规避它们?

最佳答案

kable 的输出是一个副作用;您可以将输出的值存储在变量中,但只需运行 kable 就会向控制台输出一些内容。当您运行 kable(df) 两次时,这不是问题,您不会存储任何内容,并且该函数会将输出转储到控制台两次。

但是,当您运行lapply(lst, kable)时,该函数会将输出转储到控制台,然后显示列表的值。尝试在控制台中运行此命令:

lst <- list(df, df)
lapply(lst, kable)

你应该得到这个:

|   |letters | numbers|
|:--|:-------|-------:|
|x |a | 1|
|y |b | 2|
|z |c | 3|


| |letters | numbers|
|:--|:-------|-------:|
|x |a | 1|
|y |b | 2|
|z |c | 3|
[[1]]
[1] "| |letters | numbers|" "|:--|:-------|-------:|"
[3] "|x |a | 1|" "|y |b | 2|"
[5] "|z |c | 3|"

[[2]]
[1] "| |letters | numbers|" "|:--|:-------|-------:|"
[3] "|x |a | 1|" "|y |b | 2|"
[5] "|z |c | 3|"

注意如何输出正确的 markdown,然后显示您创建的列表的实际值。这就是产生不良输出的原因。

函数范式对于副作用的处理效果不是特别好,所以你有几个选择。您可以通过将 output 参数设置为 FALSE 来存储 kable 的结果,也可以仅使用 for浏览您的列表,或者您可以阻止显示结果列表。这里有一些可行的示例。

```{r nograpes1, results="asis"}
lst <- list(df, df)
for(x in lst) kable(x) # Don't create a list, just run the function over each element
```

```{r nograpes2, results="asis"}
lst <- list(df, df)
invisible(lapply(lst, kable)) # prevent the displaying of the result list.
```

```{r nograpes3, results="asis"}
lst <- list(df, df)
l <- lapply(lst, kable) # Store the list and do nothing with it.
```

在我看来,这是一个很好的例子,说明何时应该在 R 中使用 for ,因为它最清楚地表达了您希望如何使用基于副作用的方法功能。

关于r - 从 lapply 或带有 print 语句的函数调用时 kable 出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com