数据帧在函数内部不起作用

时间:2012-04-06 16:13:50

标签: r function dataframe

当尝试在函数内部生成data.frame时,发现在调用函数时,尽管一切显然在函数之外运行良好,但未生成data.frame

任何人都可以告诉我这怎么可能?

Species=c("a","b","c")
data=data.frame(Species)

df=data.frame(matrix(nrow=length(levels(data$Species)),ncol=43))
rm(df)
f<-function(data)
{
df=data.frame(matrix(nrow=length(levels(data$Species)),ncol=43)) 
}
f(data)

在我的Rstudio中,调用函数data.frame时生成f

> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_Australia.1252       
LC_CTYPE=English_Australia.1252                   
LC_MONETARY=English_Australia.1252
[4] LC_NUMERIC=C                       LC_TIME=English_Australia.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plyr_1.7.1         maptools_0.8-14    lattice_0.20-0     foreign_0.8-48     
geosphere_1.2-26  
[6] rgdal_0.7-8        outliers_0.14      XML_3.9-4.1        PBSmapping_2.62.34     
dismo_0.7-14      
[11] raster_1.9-58      sp_0.9-93         

loaded via a namespace (and not attached):
[1] grid_2.14.1  tools_2.14.1

1 个答案:

答案 0 :(得分:0)

这应该不足为奇。您尚未在函数中的任何位置指定函数应返回的内容。这可以像在R中显示在命令提示符下创建的对象一样完成:键入对象的名称。或者,您可以使用return()

换句话说,修改你的函数如下(我已将“df”更改为“mydf”,将“data”更改为“mydata”以避免与基本R函数发生任何潜在冲突):

f <- function(mydata)
{
  mydf = data.frame(matrix(nrow=length(levels(data$Species)), ncol=43))
  mydf
  ## Or, more explicitly
  ## return(mydf)
}

您现在可以使用f(data)运行它。但请注意,这只会显示输出,而不是将其分配给对象。如果您希望将其分配给对象(例如“mydf”),则需要使用mydf <- f(data)


还有另一个选项,在你的函数中使用<<-

f <- function(mydata)
{
  mydf <<- data.frame(matrix(nrow=length(levels(data$Species)), ncol=43))
  ## uncomment the next line if you want to *display* the output too
  ## mydf
}

> rm(mydf)
> ls(pattern = "mydf")
character(0)
> f(data) ## No ouput is displayed when you run the function
> ls(pattern = "mydf")
[1] "mydf"