Почему параметры expand.grid игнорируются?

У меня проблема с expand.grid. Кажется, что я игнорирую опции, установленные в верхней части моего script.

Для exmaple:

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" ...

Что я делаю неправильно?

Ответ 1

Это связано с тем, что аргумент функции expand.grid по умолчанию имеет значение TRUE. Если вы просто наберете ?expand.grid или head(expand.grid) из сеанса R, вы увидите, что определение функции:

> 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").

Поэтому вам нужно будет установить его явно.

Ответ 2

В дополнение к объяснению @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