Я изменил ваш код так, как я считаю, будет работать. Вы не предоставили пример данных, поэтому я не могу убедиться, что они работают так, как вы хотите. Я основываю свою попытку здесь на нескольких распространенных ошибках новичка, которые я сделаю все возможное, чтобы объяснить.
Ваша функция writedata
была написана, чтобы быть немного свободной с ее областью действия. Когда вы создаете новую функцию, то, что происходит в ней, технически происходит в ее собственной среде . То есть он пытается искать вещи, определенные в функции, а затем любые новые объекты, которые он создает, создаются только в этой среде. R также имеет эту замечательную (и иногда хитрую) функцию, которая, если он не может найти объект в среде, попытается найти родительскую среду.
Влияние, которое это оказывает на вашу функцию writedata
, заключается в том, что когда R ищет в функции baskets.df
и не может ее найти, R затем поворачивается к Глобальной среде, находит там baskets.df
и затем использует ее. в rbind
. Однако результат rbind
сохраняется в baskets.df
в среде function и не обновляет объект с тем же именем в глобальной среде.
Для решения этой проблемы я добавил аргумент к writedata
, который просто называется data
. Затем мы можем использовать этот аргумент для передачи фрейма данных в среду функции и делать все локально. Не делая никаких присваиваний в конце, мы неявно сообщаем функции, чтобы она возвращала свой результат.
Затем в вашем цикле вместо простого вызова writedata
мы присваиваем его результат обратно baskets.df
для замены предыдущего результата.
for(i in 1:length((user_data)))
{
for(j in i:length(user_data))
{
if(user_data$challenge_sequence[i] == user_data$challenge_sequence[j] &&
user_data$challenge[i] == user_data$challenge[j])
{
baskets.df <- writedata(baskets.df,
user_data$challenge_sequence[i],
user_data$challenge[i])
}
}
}
writedata=function(data, seqnn,challng)
{
#print(seqnn)
#print(challng)
newRow <- data.frame(Sequence = seqnn,
Challenge = challng,
countno = 1)
rbind(data, newRow)
}