dcast和knitr的范围问题

时间:2016-12-02 17:21:19

标签: r data.table knitr

我创建了一个名为test.R的简单R文件:

library(knitr)

file <- "test.Rmd"

k <- function(input, output){
  knit(input, output)
}

k(file, "badtest.md")

knit(file, "goodtest.md")

k(file, "badtest2.md")

随附一个名为test.Rmd的小型Rmd文件:

```{r define, echo = FALSE, warning=FALSE} 
suppressPackageStartupMessages(library(data.table))
xsum <- function(x){
  sum(x, na.rm = TRUE)
}
```
```{r, echo = FALSE}
mt <- as.data.table(mtcars)
f <- function(d){
  dcast(d,  drat ~ cyl, fun.aggregate = list(xsum), value.var = "carb") 
}

f(mt)[1:5]

```

目标是对数据运行xsum函数。在knit调用位于函数(badtest.md)内的第一种情况下,它会以Error in eval(expr, envir, enclos): could not find function "xsum"失败。

第二种情况(goodtest.md)在函数之外,并且成功。

第三种情况(badtest2.md)与第一种情况相同,但现在第二种情况也已成功。

为什么会出现这个范围问题,如何解决它以便我可以使用xsum或任何自定义功能?

1 个答案:

答案 0 :(得分:0)

解决方案是明确地传递函数,就像我在data.table问题页面上从this comment找到的那样:

f <- function(d, fun.aggregate){
  dcast(d,  drat ~ cyl, fun.aggregate = fun.aggregate, value.var = "carb") 
}