2013-09-10 2 views
-2

Попытка реализовать решение для более раннего сообщения и столкнулась с поведением, которое я не понимаю с помощью функций.Dataframe не помнит изменения, внесенные функцией

У меня есть набор данных формы:

tC <- textConnection("Col1 Col2 Col3 
yes no no 
yes no yes 
yes yes yes"); 
data1 <- read.table(header=TRUE, tC); 
close.connection(tC); 
rm(tC); 
data1["Col4"] <- NA; 

Теперь я хотел бы использовать функцию (на данный момент) произвольно заменить записи в колонке 4:

updateRow <- function(rIndex) { 
    data1[rIndex, 4] <- 1 
data1 <- return(data1) 
} 

Однако, когда Я применяю эту функцию, она, как представляется, обновляется, как ожидалось (запись строки 1 col4 становится «1»), но тогда кадр данных возвращается к его исходному содержимому, когда я его называю:

updateRow(4) 
data1 

Может кто-нибудь объяснить, почему это так и что я делаю неправильно?

+1

Я заметил, что ты не принял ответа на два последних вопроса, вы просили. Обратите внимание, что если вы хотите продолжить получать помощь на этом сайте, это любезно согласиться с ответом, который предоставит вам лучшее решение для ваших нужд. Вы можете принять ответы, установив флажок под голосом. – dayne

+0

Спасибо. Я не знал об этом, но сделал это. – marcel

ответ

1

Ваш синтаксис неверен, если целью является обновление данных1. Вы должны использовать

updateRow <- function(rIndex) { 
    data1[rIndex, 4] <- 1 
    return(data1) 
} 
data1<-updateRow(4) 

Это должно быть сделано. Он будет обновлять строку 4 и столбец 4 и установите значение 1.

Если вы хотите, чтобы пропустить последнее задание можно определить функцию

updateRow <- function(rIndex) { 
    data1[rIndex, 4] <<- 1 
} 
updateRow(4) 

, который будет также обновить строку 4 и столбец 4 в значение 1. Это то же самое решение, что и dayne в его ответе.

+0

@dayne Я раньше не видел вашего ответа. Я просто итеративно улучшил свой собственный ответ. Если вы чувствуете себя нарушенным, я могу, конечно, удалить его. Я добавил ваше имя к моему ответу. –

+0

Спасибо, это отлично работает. Также мое введение в «<< -», которого я раньше не видел. – marcel

+2

@marcel - процитировать 'fortune (174)' 'Я бы хотел, чтобы' << - 'никогда не был изобретен, поскольку это делает эзотерическую и опасную особенность языка * кажущейся нормальной и разумной. Если вы хотите окунуться в R/S на макроязык, это для вас оператор ». - Bill Venables (2001). Это не слишком распространенная функция в мире R. – thelatemail

0

Вы не назначаете ничего для dataRow, и поэтому data1 внутри updateRow не «экспортируется» из функции, то есть вы никогда не обновляете данные1. Вы должны сказать data1 <- updateRow(4)

3

У вас в коде много ошибок синтаксиса. Я думаю, вы на самом деле хотите позвонить updateRow(1). Это еще одно решение, которое не требует переопределения вашего фрейма данных. Ваша проблема связана с непониманием среды R. Это post помогло мне много.

updateRow <- function(rIndex) { 
    data1[rIndex, 4] <<- 1 
} 

> data1 
    Col1 Col2 Col3 Col4 
1 yes no no NA 
2 yes no yes NA 
3 yes yes yes NA 

> updateRow(1) 
> data1 
    Col1 Col2 Col3 Col4 
1 yes no no 1 
2 yes no yes NA 
3 yes yes yes NA 

> updateRow(4) 
> data1 
    Col1 Col2 Col3 Col4 
1 yes no no 1 
2 yes no yes NA 
3 yes yes yes NA 
4 <NA> <NA> <NA> 1 
2

Вы можете использовать комбинацию eval.parent и bquote:

updateRow <- function(rIndex) eval.parent(bquote(data1[.(rIndex), 4] <- 1)) 

Результат:

> updateRow(4) 
> data1 
    Col1 Col2 Col3 V4 
1 yes no no NA 
2 yes no yes NA 
3 yes yes yes NA 
4 <NA> <NA> <NA> 1 
+0

Этот ответ напомнил мне о более раннем вопросе, который запрашивал функцию «inc» или «++»: http://stackoverflow.com/questions/7768686/r-self-reference/7769296#7769296. Эффективно обойти обычную R-парадигму. –

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