Я бы очень опасался менять поведение по умолчанию;Вы никогда не знаете, когда другая функция, которую вы используете, зависит от обычного поведения по умолчанию.Вместо этого я бы написал аналогичную функцию для вашего subsetDrop
, но для [
, например
sel <- function(x, ...) droplevels(x[...])
Тогда
> d <- data.frame(a=factor(LETTERS[1:5]), b=factor(letters[1:5]))
> str(d[1:2,])
'data.frame': 2 obs. of 2 variables:
$ a: Factor w/ 5 levels "A","B","C","D",..: 1 2
$ b: Factor w/ 5 levels "a","b","c","d",..: 1 2
> str(sel(d,1:2,))
'data.frame': 2 obs. of 2 variables:
$ a: Factor w/ 2 levels "A","B": 1 2
$ b: Factor w/ 2 levels "a","b": 1 2
Если вы действительно хотите изменить значение по умолчанию, вы можетесделайте что-то вроде
foo <- `[.data.frame`
`[.data.frame` <- function(...) droplevels(foo(...))
, но убедитесь, что вы знаете, как работают пространства имен, поскольку это будет работать для всего, что вызывается из глобального пространства имен, но версия в базовом пространстве имен не изменяется.Это может быть хорошо, но это то, что вы хотите, чтобы убедиться, что вы понимаете.После этого изменения вывод будет таким, как вы хотите.
> str(d[1:2,])
'data.frame': 2 obs. of 2 variables:
$ a: Factor w/ 2 levels "A","B": 1 2
$ b: Factor w/ 2 levels "a","b": 1 2