2016-12-02 64 views
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或任何自定義函數?

+0

使用'針織(輸入,輸出,ENVIR = .GlobalEnv)'什麼''k' – rawr

+0

這裏確實解決了這個問題,但我正在尋找一個不使用全局環境的解決方案。我把一個函數放在'knit'中的動機就是這樣,所以這些對象不會坐在旁邊並且可以被垃圾收集。 –

+0

而不是'globalenv()',你應該使用'parent.frame()'。 –

回答

0

的解決方案是通過功能明確,因爲我從this comment發現了data.table問題頁:

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