0
我創建了一個簡單的R檔名爲test.R
:範圍界定問題與dcast和knitr
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
或任何自定義函數?
使用'針織(輸入,輸出,ENVIR = .GlobalEnv)'什麼''k' – rawr
這裏確實解決了這個問題,但我正在尋找一個不使用全局環境的解決方案。我把一個函數放在'knit'中的動機就是這樣,所以這些對象不會坐在旁邊並且可以被垃圾收集。 –
而不是'globalenv()',你應該使用'parent.frame()'。 –