2015-10-12 2 views
1

из Mathematica Я начал использовать R. В Mathematica есть функция MapThread. Элементы из разных списков подключаются к функции. Вот небольшой пример:Функция MapThread из Mathematica в R

MapThread[#1*#2 &, {{1, 2, 3}, {4, 5, 6}}]

Возвращает:

{4, 10, 18}

мне было интересно, если есть идентичные функции в R.

ответ

2

You мог бы использовать mapply для этого:

mapply('*', c(1,2,3), c(4,5,6)) 
[1] 4 10 18 

Первый аргумент - это функция, которая будет применяться по-разному по следующим аргументам (в этом случае умножение *). Тогда вторым аргументом является первый вектор, а третий аргумент - второй вектор (на чьи элементы будет применена функция).

Вы можете увидеть больше примеров и прочитать об этом, если вы наберете ?mapply на консоли.

+0

BTW, жесткий путь был бы «1: 3 * 4: 6' :-) – akrun

+1

@akrun Спасибо Akrun, и определенно лучший способ для этого примера :) – LyzandeR

+1

@ Roland Это хороший Roland. Не хотите добавить его в качестве ответа? – LyzandeR

2

Если по какой-то странной причине вы можете сделать очевидным, например, c(1,2,3) * c(4,5,6), do.call будет более эффективным, чем mapply: do.call("*", list(c(1,2,3), c(4,5,6)))

Я думаю, что это эквивалент того, что делает ваш код Mathematica.

+0

'mapply' - это цикл. Попробуйте 'mapply (function (x, y) {print (x); x * y}, c (1,2,3), c (4,5,6))'. – Roland

+0

Да, я сейчас это петля, я просто подумал, что это будет очень быстро, потому что это основано на C. Круто, сегодня я узнал что-то новое. – LyzandeR

+1

У вас по-прежнему есть один вызов функции R для каждой итерации, даже если вызов выполняется с помощью кода C. – Roland