Глядя на код droplevels
методов в источнике R, вы можете видеть , он обтекает функцию factor
. Это означает, что вы можете в основном воссоздать столбец с функцией factor
. Ниже data.table способ сбросить уровни из всех столбцов факторов.
library(data.table)
dt = data.table(letters=factor(letters[1:5]), numbers=seq(1:5))
levels(dt$letters)
#[1] "a" "b" "c" "d" "e"
subdt = dt[numbers <= 3]
levels(subdt$letters)
#[1] "a" "b" "c" "d" "e"
upd.cols = sapply(subdt, is.factor)
subdt[, names(subdt)[upd.cols] := lapply(.SD, factor), .SDcols = upd.cols]
levels(subdt$letters)
#[1] "a" "b" "c"
Один (функциональный) способ сделать это использует приправление карри и закрытия
r.WithContext(BuildContext(
r.Context(),
SchemaId(mySchemaId),
RequestId(myRequestId),
Logger(myLogger)
))
func RequestId(id string) partialContextFn {
return func(ctx context.Context) context.Context {
return context.WithValue(ctx, requestIdCtxKey, requestId)
}
}
func BuildContext(ctx context.Context, ctxFns ...partialContextFn) context.Context {
for f := range ctxFns {
ctx = f(ctx)
}
return ctx
}
type partialContextFn func(context.Context) context.Context