我创建了一个名为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
或任何自定义功能?
答案 0 :(得分:0)
解决方案是明确地传递函数,就像我在data.table问题页面上从this comment找到的那样:
f <- function(d, fun.aggregate){
dcast(d, drat ~ cyl, fun.aggregate = fun.aggregate, value.var = "carb")
}