Предположим, у меня есть два вектора
a <- c(1,2,3,4,5)
b <- c(6,7,8,9,10)
и функция
calc <- function(x,y){x + y)
Я хочу применить эту функцию для 1-го значения в a
для каждого значения в b
. Предположим, что в моем случае calc
допускает только одно значение из a
и b
в качестве входных данных, поэтому lapply(a,calc,b)
не будет работать, потому что тогда длина (b) не равна 1 (выдает мне ошибку).
Кроме того, mapply
также не дает мне желаемого решения, он применяет функцию только к парным значениям, то есть 1+6
, 2+7
и т. д.
Поэтому я создал функцию, которая дала мне нужное решение
myfunc <- function(z){lapply(a,calc,z)}
и применил его на b
solution <- lapply(b,myfunc)
Здесь мы видим, что отличие от lapply(a,calc,b)
или вложенного lapply(a,lapply,calc,b)
заключается в том, что он дает мне все значения в своем собственном списке. Это то, что я хотел, или, по крайней мере, это была функция, которая давала мне правильный результат без ошибок.
Теперь, есть ли более быстрый/тривиальный метод, потому что я просто немного поэкспериментировал здесь. И с моей функцией, которая намного больше, чем calc
, это занимает 10 минут, но, возможно, мне придется уменьшить исходную функцию, и здесь не будет более быстрого метода...
ИЗМЕНИТЬ:
В моей функции есть что-то вроде этого,
calc <- function(x,y){
# ...
number <- x
example <- head(number,n=y)
# ...
}
где вектор в качестве входных данных для y больше не работает. С lapply(a,lapply,calc,b)
или lapply(a,calc,b)
я получаю сообщение об ошибке,
Error in head.default(number, n = y) : length(n) == 1L is not TRUE
outer(a,b,calc)
? - person Florian   schedule 25.07.2018function
нужно правильно векторизовать - person MichaelChirico   schedule 25.07.2018SIMPLIFY=FALSE
в вызовеmapply()
? - person AkselA   schedule 25.07.2018SIMPLIFY=FALSE
и решил, почему я до этого не додумался, я даже пользовался им ранее. Вывод действительно лучше, потому что это список из 25 элементов, где я могу посмотреть его по горизонтали вeg
, к какому входному параметру принадлежитn
-й элемент. - person jackbauer   schedule 25.07.2018calc()
и посмотреть, есть ли способ сделать это быстрее. Может быть, стоит перейти на Code Review? - person AkselA   schedule 25.07.2018example <- head(number,n=y)
, которая требует одиночных скаляров в качестве входных значений, поэтому ваша функция может работать с первой показанной функциейcalc
, но не для моей собственно функция... - person jackbauer   schedule 25.07.2018