R With vs.Lappy-为什么With在这里不起作用?

R With vs.Lappy-为什么With在这里不起作用?,r,lapply,with-statement,R,Lapply,With Statement,我正在努力学习R,但真的不知道什么时候可以适当地使用它。我在想这个例子: 目标是以多种方式将整个数据帧“stroke”(在ISwR数据库中)中的“dstr”和“died”转换为日期格式(仅供练习)。我成功地做到了这一点: #applying a function to the whole data frame - use the fact that data frames are lists actually rawstroke=read.csv2(system.file("rawdata","

我正在努力学习R,但真的不知道什么时候可以适当地使用它。我在想这个例子:

目标是以多种方式将整个数据帧“stroke”(在ISwR数据库中)中的“dstr”和“died”转换为日期格式(仅供练习)。我成功地做到了这一点:

#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)
但是,当我尝试使用with函数时,它不会将数据帧作为输出,而是只编写函数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)

如果有人能帮我,那就太好了

是的,这看起来不像是
的工作。要在这里使用函数,只需将第一个代码中的
as.Date
替换为
myfun
,并删除格式参数,如

rawstroke[ix]=lapply(rawstroke[ix], myfun)
with
用于更干净地访问数据帧和环境中的变量。例如,代替

t.test(dat$x, dat$y)
你可以

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

您似乎认为
with()
以某种方式在环境变量上循环,但实际上并非如此。它甚至与
lappy()
不尽相同。查看控制台中带有.default的源代码。这基本上只是一种简单而干净的访问环境的方式。谢谢。所以基本上,我可以在中使用函数,只要我能明确地写下它们?我的意思是,例如,with(stroke,age*2)可以很好地工作(在元素上循环)。但是,如果想要使用我定义的函数,我应该使用lappy?听起来像是一个新问题,从这一点上不清楚为什么会在元素上循环
with
不执行循环,它只针对任何表达式,它不仅在全局环境中查找变量,而且在“使用”表达式的任何地方都会查找变量。谢谢。我想我明白了。在某种程度上,我认为它可以循环,从某种意义上说,它应用了操作元素。如果我理解正确的话,它会以某种方式解释操作是按元素还是按列进行的,所以从这个意义上讲它是灵活的。。。也许你注意到了矢量化操作的效果?无论您是否将
一起使用,都会发生这种情况。