2014-06-04 35 views
12

我遇到了問題expand.grid。它似乎忽略了我在腳本頂部設置的選項。爲什麼expand.grid忽略選項?

對於〔實施例:

options(stringsAsFactors = FALSE) 
tmp <- expand.grid(x = letters, y = 1:10) 

回報:

> str(tmp) 
'data.frame': 260 obs. of 2 variables: 
$ x: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ y: int 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "out.attrs")=List of 2 
    ..$ dim  : Named int 26 10 
    .. ..- attr(*, "names")= chr "x" "y" 
    ..$ dimnames:List of 2 
    .. ..$ x: chr "x=a" "x=b" "x=c" "x=d" ... 
    .. ..$ y: chr "y= 1" "y= 2" "y= 3" "y= 4" ... 

我在做什麼錯?

+3

因爲參數是硬編碼,而不是設置爲'default.stringsAsFactors()'。可以說,如果你有厚厚的皮膚,那麼可以把它作爲一種潛在的改變提出來。 – joran

+6

'?options'表明'options(stringsAsFactors = FALSE)'只會影響'data.frame'和'read.table':''stringsAsFactors':'data.frame'和'read的參數的默認設置。表'。」 –

回答

15

這是因爲expand.grid的函數參數默認設置爲TRUE。如果你只是從R會話中鍵入?expand.gridhead(expand.grid),你會看到函數的定義是:

> head(expand.grid) 

1 function (..., KEEP.OUT.ATTRS = TRUE, stringsAsFactors = TRUE) 
2 {                
3  nargs <- length(args <- list(...))       
4  if (!nargs)             
5   return(as.data.frame(list()))       
6  if (nargs == 1L && is.list(a1 <- args[[1L]])) 

這是從提供給read.table()的默認值不同,例如:

> head(read.table) 
1 function (file, header = FALSE, sep = "", quote = "\\"'", dec = ".",   
2  row.names, col.names, as.is = !stringsAsFactors, na.strings = "NA",  
3  colClasses = NA, nrows = -1, skip = 0, check.names = TRUE,    
4  fill = !blank.lines.skip, strip.white = FALSE, blank.lines.skip = TRUE, 
5  comment.char = "#", allowEscapes = FALSE, flush = FALSE,     
6  stringsAsFactors = default.stringsAsFactors(), fileEncoding = "",  

其中default.stringsAsFactors()基本上會返回getOption("stringsAsFactors")

因此您必須明確設置它。

14

除了@Arun的解釋,你可以用expand.grid

expand_grid <- 
    function(...,stringsAsFactors= getOption("stringsAsFactors")) 
    expand.grid(...,stringsAsFactors=stringsAsFactors) 

現在,如果你申請了新的功能,你需要的類型:

options(stringsAsFactors = FALSE) 
tmp <- expand_grid(x = letters, y = 1:10) 
str(tmp,max=1) 
## 'data.frame': 260 obs. of 2 variables: 
## $ x: chr "a" "b" "c" "d" ... 
## $ y: int 1 1 1 1 1 1 1 1 1 1 ... 
## - attr(*, "out.attrs")=List of 2