Una soluzione (pericoloso), è quello di effettuare le seguenti operazioni:
- Lista tutte le funzioni che hanno come argomento
na.rm
. Qui ho limitato la mia ricerca al pacchetto base.
- Recupera ciascuna funzione e aggiungi questa riga all'inizio del suo corpo:
na.rm = TRUE
- Assegna la funzione al pacchetto base.
Quindi, prima devo conservare in un elenco (ll) tutte le funzioni che hanno come argomento na.rm
:
uses_arg <- function(x,arg)
is.function(fx <- get(x)) &&
arg %in% names(formals(fx))
basevals <- ls(pos="package:base")
na.rm.f <- basevals[sapply(basevals,uses_arg,'na.rm')]
EDIT metodo migliore per ottenere le funzioni di argomenti tutti di na.rm (grazie a mnel commento)
Funs <- Filter(is.function,sapply(ls(baseenv()),get,baseenv()))
na.rm.f <- names(Filter(function(x) any(names(formals(args(x)))%in% 'na.rm'),Funs))
Così na.rm.f
lista assomiglia:
[1] "all" "any" "colMeans" "colSums"
[5] "is.unsorted" "max" "mean.default" "min"
[9] "pmax" "pmax.int" "pmin" "pmin.int"
[13] "prod" "range" "range.default" "rowMeans"
[17] "rowsum.data.frame" "rowsum.default" "rowSums" "sum"
[21] "Summary.data.frame" "Summary.Date" "Summary.difftime" "Summary.factor"
[25] "Summary.numeric_version" "Summary.ordered" "Summary.POSIXct" "Summary.POSIXlt"
Quindi per ogni funzione cambio il corpo, il codice è ispirato dal pacchetto data.table
(Domande frequenti 2.23) che aggiunge una riga all'inizio di rbind.data.frame
e cbind.data.frame
.
ll <- lapply(na.rm.f,function(x)
{
tt <- get(x)
ss = body(tt)
if (class(ss)!="{") ss = as.call(c(as.name("{"), ss))
if(length(ss) < 2) print(x)
else{
if (!length(grep("na.rm = TRUE",ss[[2]],fixed=TRUE))) {
ss = ss[c(1,NA,2:length(ss))]
ss[[2]] = parse(text="na.rm = TRUE")[[1]]
body(tt)=ss
(unlockBinding)(x,baseenv())
assign(x,tt,envir=asNamespace("base"),inherits=FALSE)
lockBinding(x,baseenv())
}
}
})
No se si controlla, la prima linea di ogni funzione della nostra lista:
unique(lapply(na.rm.f,function(x) body(get(x))[[2]]))
[[1]]
na.rm = TRUE
Sfortunatamente, la risposta che non vuoi è l'unica che funziona in generale. Non esiste un'opzione globale per questo come c'è per 'na.action', che riguarda solo le funzioni di modellazione come' lm', 'glm', etc (e anche lì, non è garantito che funzioni in tutti i casi). –
@HongOoi - Penso che alla luce del numero elevato di voti positivi del tuo commento dovrebbe essere ridisegnato come risposta (o "la" risposta potenzialmente). – thelatemail
Un'alternativa per avere un controllo preciso di dove/quando omettere NA potrebbe essere includere una variabile come 'do.omit.na = TRUE' all'inizio del tuo script, e usarla successivamente se applicabile con' max (x, na.rm = do.omit.na) '. – QuantIbex