2016-03-05 5 views
0

Я начинаю с R. Я взял 2d-образец в списке. Этот список содержит 2 векторов с 100 элементами либо один:Применить отдельную функцию для списка в R

muestra2d <- take_samples(2, 100, c(-100, 100)); 

Я функция, которая вычисляет коэффициенты т и б строки в виде y=mx+b в коробке в заданном диапазоне.

vars <- sim_line(c(-100, 100)) 

Хорошо, моя цель применить функцию f(x,y)=y-ax-b, где x является элементом muestra2d[1], y является элементом muestra2d[2], a представляет собой наклон линии (м) и b это смещение линии. Функция должна маркировать образец значком функции для каждой пары значений (x, y).

Я попробовал его с этой линией

result <- lapply(muestra2d, function(x,y) (y-(vars[5]*x)-vars[6])) 

мышления lapply принимает элемент из первого вектора списка и копирует его в x, делает то же самое для y и применения функции к этим значениям, но это не очень хорошая идея.

Как я могу это сделать? Как я могу построить линию, точки и отрицательные точки с другим цветом одновременно?

+0

Арифметика в R является vectorised, так что вы можете просто написать что-то вроде 'результат <- muestra2d [1,] - вары [5] * muestra2d [2,] - вары [6]' , Возможно, у меня не было индексации, потому что я не знаю, как выглядит вывод 'take_samples()'. – Stibu

+0

Вывод 'take_samples()' возвращает список из двух векторов. Вы видите muestra2d как матрицу. Я переинтерпретировал ваше выражение следующим образом: 'result <- muestra2d [[1]] - vars [5] * muestra2d [[2]] - vars [6]'. При этом я оцениваю выражение для того же индекса в первом векторе и в секундах muestra2d. Спасибо за ваш комментарий, мой друг. – Carlos

+2

'2dsample' не является допустимым именем для объекта. – jogo

ответ

1
set.seed(1L); 
take_samples <- function(sample.num,elem.num,box) lapply(seq_len(sample.num),function(i) runif(elem.num,box[1L],box[2L])); 
sim_line <- function(box) c(1,0); 
box <- c(-100,100); 
muestra2d <- take_samples(2L,100L,box); 
vars <- sim_line(box); 
signs <- sign(muestra2d[[2L]] - vars[1L]*muestra2d[[1L]] - vars[2L]); 
par(xaxs='i',yaxs='i'); 
plot(NA,xlim=box,ylim=box,xlab='x',ylab='y',main='plot'); 
abline(vars[2L],vars[1L]); 
with(setNames(muestra2d,c('x','y')),{ 
    points(x[signs>=0],y[signs>=0],col='green'); 
    points(x[signs<0],y[signs<0],col='red'); 
}); 

plot

+0

Удивительный, мой друг. Это то, что я ищу, но я начинаю, и мне сложно понять ваш код. – Carlos

+0

После прочтения и повторного чтения кода, в конце работает в моей цели. Мне пришлось переосмыслить и переписать некоторые вещи, но вы оказали мне реальную помощь. Спасибо за все! – Carlos

Смежные вопросы