Si dovrebbe pagare più attenzione a Gabor Grothendeick (e non solo in questo caso.) La funzione inc
citata sul blog di Matt Asher fa tutto quello che ti stai chiedendo:
(e l'estensione ovvia funziona anche.)
add <- function(x, inc=1) {
eval.parent(substitute(x <- x + inc))
}
# Testing the `inc` function behavior
EDIT: Dopo il mio temporaneo fastidio per la mancanza di approvazione nel primo commento, ho preso la sfida di aggiungere ancora un ulteriore argomento di funzione. Fornito con un argomento di una parte di un dataframe, incrementerebbe comunque l'intervallo di valori di uno. Fino a questo punto è stata solo molto leggermente testato su infissa operatori diadici, ma non vedo alcun motivo per non funzionerebbe con qualsiasi funzione che accetta solo due argomenti:
transfn <- function(x, func="+", inc=1) {
eval.parent(substitute(x <- do.call(func, list(x , inc)))) }
(ammissione Guilty: Questo in qualche modo "si sente male "dal punto di vista R tradizionale di restituzione di valori per l'assegnazione) il test precedenza sulla funzione inc
è qui sotto:.
> df <- data.frame(a1 =1:10, a2=21:30, b=1:2)
> inc <- function(x) {
+ eval.parent(substitute(x <- x + 1))
+ }
> inc(df$a1) # works on whole columns
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 6 25 1
6 7 26 2
7 8 27 1
8 9 28 2
9 10 29 1
10 11 30 2
> inc(df$a1[df$a1>5]) # testing on a restricted range of one column
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 7 25 1
6 8 26 2
7 9 27 1
8 10 28 2
9 11 29 1
10 12 30 2
> inc(df[ df$a1>5, ]) #testing on a range of rows for all columns being transformed
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 8 26 2
6 9 27 3
7 10 28 2
8 11 29 3
9 12 30 2
10 13 31 3
# and even in selected rows and grepped names of columns meeting a criterion
> inc(df[ df$a1 <= 3, grep("a", names(df)) ])
> df
a1 a2 b
1 3 22 1
2 4 23 2
3 4 23 1
4 5 24 2
5 8 26 2
6 9 27 3
7 10 28 2
8 11 29 3
9 12 30 2
10 13 31 3
fonte
2011-10-14 14:41:17
Vedere la funzione 'inc' qui: http://www.statisticsblog.com/2011/10/waiting-in-line-waiting-on-r/ –
Stai cercando' adataframe <- transform (adataframe, qualcosa = qualcosa + 1) '? Non del tutto autoreferenziale ma almeno un po 'meno noioso di quello che hai sopra –
Lasciare cadere il ridondante che per cominciare. – hadley