Eine Abhilfe (gefährlich), ist folgendes zu tun:
- Liste aller Funktionen, die
na.rm
als Argument haben. Hier habe ich meine Suche auf das Basispaket beschränkt.
- Holen Sie jede Funktion und fügen Sie diese Zeile am Anfang ihres Körpers:
na.rm = TRUE
- Weisen Sie die Funktion zurück zum Basispaket.
Also zuerst speichere ich in einer Liste (ll) alle Funktionen na.rm
als Argument haben:
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 bessere Methode, um alle na.rm Argument Funktionen zu erhalten (dank Kommentar MNEL)
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))
So na.rm.f
Liste wie folgt aussieht:
[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"
Dann für jede Funktion ändere ich den Körper, der Code ist inspiriert von data.table
Paket (FAQ 2.23), die eine Zeile an den Anfang von rbind.data.frame
und cbind.data.frame
hinzufügen.
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())
}
}
})
Nein, wenn Sie die erste Zeile jeder Funktion unserer Liste überprüfen,:
unique(lapply(na.rm.f,function(x) body(get(x))[[2]]))
[[1]]
na.rm = TRUE
Leider ist die Antwort, die Sie nicht wollen, die einzige, die allgemein funktioniert. Es gibt keine globale Option dafür, wie es für "na.action" gilt, was nur Modellierungsfunktionen wie "lm", "glm" usw. betrifft (und selbst dort wird nicht garantiert, dass es in allen Fällen funktioniert). –
@HongOoi - Ich denke, angesichts der großen Anzahl von Upvotes auf Ihren Kommentar sollte es als Antwort (oder "die" mögliche Antwort) aufgefrischt werden. – thelatemail
Eine Alternative, um eine genaue Kontrolle darüber zu haben, wo/wann man NAS weglassen sollte, könnte sein, am Anfang des Skripts eine Variable wie 'do.omit.na = TRUE' einzufügen und sie danach mit max zu verwenden (x, na.rm = do.omit.na) '. – QuantIbex