2016-07-14 8 views
1

Я пытаюсь изучить R и не могу понять, когда использовать с соответствующим образом. Я думал об этом примере:С против lapply - почему это не работает здесь?

Цель состоит в том, чтобы преобразовать «dstr» и «умер» во всем «штрихе» данных (в базе данных ISwR) в формат даты несколькими способами (только для практики). Я сумел сделать это следующим образом:

#applying a function to the whole data frame - use the fact that data frames are lists actually 
rawstroke=read.csv2(system.file("rawdata","stroke.csv",package="ISwR"),na.strings=".") 
names(rawstroke)=tolower(names(rawstroke)) 
ix=c("dstr","died") 
rawstroke[ix]=lapply(rawstroke[ix],as.Date,format="%d.%m.%Y") 
head(rawstroke) 

Однако, когда я пытаюсь использования с функцией он не дает кадр данных в качестве вывода, но пишет только определение функции myfun. Вот код, который я пробовал.

myfun=function(x) 
{y=as.Date(x,format="%d.%m.%Y") 
return(y)} 
rawstroke=read.csv2(system.file("rawdata","stroke.csv",package="ISwR"),na.strings=".") 
names(rawstroke)=tolower(names(rawstroke)) 
ix=c("dstr","died") 
bla=with(rawstroke[ix],myfun) 
head(bla) 

Если кто-то может помочь мне в этом, было бы здорово.

+1

Вы, кажется, думаете, что 'с()' как-то перебирает переменные окружения, которые он не делает. Он даже не близок к тому, что называется 'lapply()'. Посмотрите на источник 'with.default' в консоли. Это просто простой и чистый способ доступа к среде. –

ответ

2

Да, это не похоже на работу для with. Чтобы использовать функцию здесь, вы бы просто заменить as.Date в первом коде с myfun и удалите параметр формата, как

rawstroke[ix]=lapply(rawstroke[ix], myfun) 

with используются для более чисто доступа к переменным в кадрах данных и средах. Например, вместо

t.test(dat$x, dat$y) 

вы могли бы сделать

with(dat, t.test(x, y)) 
+0

Спасибо. Поэтому я могу использовать функции только в том случае, если я могу их явно записать? Я имею в виду, например, с (удар, возраст * 2) работает красиво (петли над элементами). Но если вы хотите использовать функции, которые я определил, я должен использовать lapply? – Mark

+0

Звучит как новый вопрос, из этого неясно, почему это зациклится на элементах. 'with' не делает цикл, он для любого выражения вообще, он просто ищет переменные не только в глобальной среде, но и в том, что вы делаете с этим выражением« с ». – Aaron

+0

Спасибо. Кажется, я понял. Хорошо в каком-то смысле я думал, что это делает цикл в некотором смысле, что он применяет элемент операции мудрый. Если я правильно ее понял, он каким-то образом интерпретирует, является ли операция мудрой или столбцовой, поэтому она является гибкой в ​​этом смысле. – Mark