Önce, aşağıdaki davranış dikkat edin:
> aa = list(a = 1:3, b = 2:5, cc = 1:5)
>
> aa[c('a', 'b')] <- NULL
>
> aa
# $cc
# [1] 1 2 3 4 5
> aa = list(a = 1:3, b = 2:5, cc = 1:5)
>
> aa[c('a', 'b')] <- list(NULL, NULL)
>
> aa
# $a
# NULL
#
# $b
# NULL
#
# $cc
# [1] 1 2 3 4 5
Şimdi within.list
için kod bakalım: fonksiyonunun son çizgiye saniyede özellikle
within.list <- function (data, expr, ...)
{
parent <- parent.frame()
e <- evalq(environment(), data, parent)
eval(substitute(expr), e)
l <- as.list(e)
l <- l[!sapply(l, is.null)]
nD <- length(del <- setdiff(names(data), (nl <- names(l))))
data[nl] <- l
if (nD)
data[del] <- if (nD == 1) NULL else vector("list", nD)
data
}
bak. Listedeki silinen öğelerin sayısı birden fazlaysa, işlev, vector("list", 2)
her öğenin NULL
olduğu iki öğe listesi oluşturduğundan, temel olarak aa[c('a', 'b')] <- list(NULL, NULL)
çağırır. Şimdi
mywithin <- function (data, expr, ...)
{
parent <- parent.frame()
e <- evalq(environment(), data, parent)
eval(substitute(expr), e)
l <- as.list(e)
l <- l[!sapply(l, is.null)]
nD <- length(del <- setdiff(names(data), (nl <- names(l))))
data[nl] <- l
if (nD) data[del] <- NULL
data
}
test edelim: Biz fonksiyonun son satırına ikinci gelen else
deyimi kaldırmak nerede within
bizim kendi sürümünü oluşturabilirsiniz
> aa = list(a = 1:3, b = 2:5, cc = 1:5)
>
> mywithin(aa, rm(a, b))
# $cc
# [1] 1 2 3 4 5
Şimdi beklenen işleri olarak!
'aa ['a'] <- NULL'? – etienne
Eh, evet. Ama bunu – martin
içinde yapmaya çalışıyorum. Bu garip bir davranış! Birini silebilirsiniz, ancak bundan sonra 3'den fazla sütun olsa bile NULL olarak kalırlar. (Aa, {"b" <- NULL; "a" <- NULL}) ' – jeremycg