R применяется с несколькими параметрами
У меня есть функция f(var1, var2)
в R. Предположим, что мы установили var2 = 1
, и теперь я хочу применить функцию f()
к списку L
. В принципе, я хочу получить новый список L * с выходами
[f(L[1],1),f(L[2],1),...,f(L[n],1)]
Как это сделать с помощью apply
, mapply
или lapply
?
Ответы
Ответ 1
Просто передайте var2 в качестве дополнительного аргумента одной из применяемых функций.
mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
var1*var2
}
var2 <- 2
sapply(mylist,myfxn,var2=var2)
Это передает те же var2
каждому вызову myfxn
. Если вместо этого вы хотите, чтобы каждый вызов myfxn
получил 1-й/2-й/3-й/и т.д. элемент как mylist
, так и var2
, то вы находитесь в домене mapply
.
Ответ 2
Если ваша функция имеет две векторные переменные и должна вычисляться по каждому их значению (как упоминается @Ari B. Friedman), вы можете использовать mapply
следующим образом:
vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
var1*var2
}
mapply(mult_one,vars1,vars2)
который дает вам:
> mapply(mult_one,vars1,vars2)
[1] 10 40 90
Ответ 3
Для дальнейшего обобщения @Alexander примера, outer
актуально в тех случаях, когда функция должна вычисляют себя на каждую пару векторных величин:
vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
var1*var2
}
outer(vars1,vars2,mult_one)
дает:
> outer(vars1, vars2, mult_one)
[,1] [,2] [,3]
[1,] 10 20 30
[2,] 20 40 60
[3,] 30 60 90
Ответ 4
Я использовал RODBC для подключения к схеме Oracle XE hr. Мне нужна была функция, которая могла бы вернуть количество записей в таблице. Так что...
function(rodbcConnection, schemaName, tableName){
results <- sqlQuery(rodbcConnection, paste("SELECT * FROM ", schemaName, ".", tableName))
return(dim(results)[1])
}
Но как применить это к вектору имен таблиц? Вот как.
> x <- sapply(hrTableNames, noOfRecords, rodbcConnection=connection, schemaName="hr")
Поскольку sapply выполняет свою работу, применяя функцию noOfRecords к каждой строке hrTableNames, R заменяет отсутствующий параметр tableName текущим итеративным значением hrTableNames.
Наконец-то.
> barplot(t(x), las=2)