2011-07-26 15 views
88

Mam funkcję f(var1, var2) w R. Załóżmy, że ustawiliśmy var2 = 1 i teraz chcę zastosować funkcję f() do listy . Zasadniczo chcę, aby uzyskać nową listę L * z wyjściamiFunkcja zastosowania R z wieloma parametrami

[f(L[1],1),f(L[2],1),...,f(L[n],1)] 

Jak mogę to zrobić z każdym apply, mapply lub lapply?

+0

Podobne pytanie: http://stackoverflow.com/questions/2545879/row-column-counter-in-apply-functions/28102021#28102021 –

Odpowiedz

127

Wystarczy przekazać var2 jako dodatkowy argument do jednej z funkcji stosujących.

mylist <- list(a=1,b=2,c=3) 
myfxn <- function(var1,var2){ 
    var1*var2 
} 
var2 <- 2 

sapply(mylist,myfxn,var2=var2) 

To przechodzi taką samą var2 do każdego wezwania myfxn. Jeśli zamiast tego chcesz, aby każda rozmowa z numerem myfxn otrzymała pierwszą/drugą/trzecią/etc. element zarówno mylist, jak i var2, jesteś w domenie mapply.

+4

jednak pamiętać, że 'może być myfxn' wektoryzowane, w którym to przypadku należy użyć 'myfxn (unlist (mylist), var2 = var2)' – baptiste

+0

Oryginalny przykład był niejasny, ale wydawał się niewizualizowany. Jednak punkt dobrze zrobiony. –

+0

Czy jest to sposób, aby działało to jako funkcja "w locie"? Coś takiego: 'sapply (mylist, function (var1, var2) { var1 * var2 }, var = thisvar2)' Ale pojawia się błąd, że argument 2 pasuje do wielu formalnych argumentów – emudrak

8

Jeśli funkcja posiada dwie zmienne wektorowej i musi obliczyć sobie na każdej wartości z nich (jak wspomniano przez @Ari B. Friedman) można użyć mapply następująco:

vars1<-c(1,2,3) 
vars2<-c(10,20,30) 
mult_one<-function(var1,var2) 
{ 
    var1*var2 
} 
mapply(mult_one,vars1,vars2) 

który zapewnia:

> mapply(mult_one,vars1,vars2) 
[1] 10 40 90 
-4

Użyłem RODBC do połączenia ze schematem Oracle XE hr. Potrzebowałem funkcji, która mogłaby zwrócić liczbę rekordów w tabeli. Więc ...

function(rodbcConnection, schemaName, tableName){ 
    results <- sqlQuery(rodbcConnection, paste("SELECT * FROM ", schemaName, ".", tableName)) 
    return(dim(results)[1]) 
} 

Ale jak zastosować to do wektora nazw tabel? Oto jak.

> x <- sapply(hrTableNames, noOfRecords, rodbcConnection=connection, schemaName="hr") 

jako sapply wykonuje swoją pracę, stosując noOfRecords funkcyjnych każdego rzędu hrTableNames R zastępuje brakujący parametru TableName z aktualną wartością iteracyjny z hrTableNames.

Wreszcie.

> barplot(t(x), las=2) 
Powiązane problemy