2016-03-01 2 views
1

У меня есть этот параметр:R: Как создать цикл для, для диапазона данных в функции?

L_inf <- seq(17,20,by=0.1) 

и эта функция:

fun <- function(x){ 
    L_inf*(1-exp(-B*(x-0)))} 

Я хотел бы применить эту функцию для диапазона значения L_inf. Я попытался с петлей for, как это:

A <- matrix() # maybe 10 col and 31 row or vice versa 
for (i in L_inf){ 
A[i] <- fun(1:10) 
} 

Бур R Ответ: longer object length is not a multiple of shorter object length. Мой ожидаемый результат - это матрица (или фрейм данных или список) с 10 результатом (fun(1:10)) для каждого значения вектора L_inf (длина = 31). Как это сделать?

ответ

3

Вы пытаетесь поместить вектор из 10 элементов в одну из матричных ячеек. Вместо этого вы хотите присвоить его матричной строке (вы можете получить доступ к i-й строке с помощью A[i,]).

Но использование цикла for в этом случае является неэффективным, и довольно просто использовать одну из функций «применить». Apply функции обычно возвращают список (который является наиболее универсальным контейнером, поскольку в принципе нет ограничений).

Здесь sapply - это прикладная функция, которая пытается выполнить S, привнося ее результат в удобную структуру данных. В этом случае, поскольку все результаты имеют одинаковую длину (10), sapply упростит результат до матрицы.

Обратите внимание, что я изменил вашу функцию, чтобы она явно зависела от L_inf. В противном случае он не будет делать то, что, по вашему мнению, должен делать (см. Ключевое слово «закрытие», если вы хотите получить дополнительную информацию).

L_inf_range <- seq(17,20,by=0.1) 
B <- 1 

fun <- function(x, L_inf) { 
    L_inf*(1-exp(-B*(x-0))) 
} 

sapply(L_inf_range, function(L) fun(1:10, L_inf=L)) 
Смежные вопросы