Вопрос по использованию функции c () в кодировании R - PullRequest
0 голосов
/ 06 февраля 2020

Я изучаю Data analyitcs, мой учитель задает вопрос для класса "использование one-sigma для нахождения любого выброса в векторе D". Он дал свой ответ, как показано ниже, но я не понимаю, почему он вызвал Out = c () перед использованием функции "for" и снова вызвал "Out" в fumction c (Out, o)? Не могли бы вы помочь мне ответить на этот вопрос? Спасибо!

D=c(4,6,1,2,8,11)  
xbar=mean(D)  
std=sd(D)  
L=xbar-std  
U=xbar+std
Out=c()
for(j in 1:length(D)){
if(D[j]<L | D[j]>U) {o=D[j]} else{o=NULL}  Out=c(Out,o)}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Необходимость существования объекта с именем Out до ввода for -l oop зависит от того, как спроектированы функции c и [<-. Им нужны имена, чтобы существовать в таблице объектов, которую поддерживает интерпретатор R. Вы использовали «=», но в этом контексте на самом деле используется функция <-, оператор присваивания. Код в вопросе, по-видимому, не использует этот оператор, но на самом деле он вызывается, когда используется знак "=" в Out=c(Out,o). Вы не можете присвоить значение для Out в LHS назначения, добавив его, потому что Out в RHS уже не имеет значения (даже значения длины 0) в списке объектов данных R когда c -функция пытается получить доступ к своему значению.

Оператор <- на самом деле является функцией, замаскированной под оператор инфикса. Вы можете продемонстрировать это с помощью:

`<-`(my.out , 4)

> my.out
[1] 4

Он также имеет индексированную версию присвоения [<-, которая требует, чтобы указанный объект на LHS существовал. Это еще один источник ошибок для пользователей -l oop. Если указанный объект LHS, присвоенный [<-, не существует во время запуска l oop, то в первый раз через l oop вы получите ошибку:

rm(my.out2)  #make sure it doesn't exist
for (i in 1:10) { my.out2[i] <- 4 }  # LHS doesn't exist, but RHS value exists
#Error: object 'my.out2' not found
0 голосов
/ 06 февраля 2020

Out=c() ваш вывод. В начале это просто пустой фрейм данных. for l oop повторяет j в length D. Таким образом, для каждого j наблюдения он выполняет условный оператор if(D[j]<L | D[j]>U) {o=D[j]} else{o=NULL}, а затем помещает результаты в вывод Out Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...