У Roland есть правильное решение для конкретной проблемы: более split()
не требуется. Просто чтобы убедиться: split()
возвращает список. Для того, чтобы получить отдельные кадры данных вы рабочее пространство, вы делаете:
list2env(split(df,df$b),.GlobalEnv)
Или, используя назначения:
tmp <- split(df,df$b)
for(i in names(tmp)) assign(i,tmp[[i]])
А слово на подмножестве
При этом, некоторые более подробно почему ваша функция проста. Прежде всего, в ?subset
вы читаете:
Предупреждение
Это удобная функция предназначена для использования в интерактивном режиме. Для программирования лучше использовать стандартные функции подмножества, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.
Переведено на: Никогда в жизни не используется subset()
внутри функции.
Слова о возвращении значения из функции
Далее в том, что функция всегда возвращает результат:
- если используются
return()
заявления, оно возвращает то, что дано как аргумент return()
.
- В противном случае он возвращает результат последней строки.
В вашем случае последняя строка содержит задание. Теперь присваивание также возвращает значение, но вы его не видите. Он возвращается invisibly
. Вы можете увидеть его, заключая его в круглые скобки, например:
> x <- 10
> (x <- 20)
[1] 20
Это абсолютно не нужно. Это причина, по которой ваша функция работает, когда используется в lapply()
(lapply ловит невидимый результат), но не даст вам никакого (видимого) вывода при использовании в командной строке. Вы можете захватить его, хотя:
> testF("b")
> x <- testF("b")
> x
a b
3 3 b
6 6 b
10 10 b
Назначение в функции не имеет смысла: либо вернуться dum
явно, или просто уронить задание ALLtogether
Исправляющие функцию
Итак, учитывая, что это всего лишь пример, и реальная проблема не будет решена простым использованием split()
, ваша функция будет:
testF <- function(select) {
dum <- df[df$b=select,]
return(dum)
}
или просто:
testF <- function(select){
df[df$b=select,]
}
Запись строки «дум» в последней строке функции, и он должен вернуть объект из функции. –
Прочитайте 'help (" function ")'. Вы также должны прочитать 'help (" subset ")', который явно запрещает использование внутренних функций 'subset'. – Roland
@ Роланд, что является примером одного из тех непредвиденных последствий? – rawr