2012-04-06 38 views
0

當試圖在函數內部生成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 

回答

0

這應該不會令人意外。你沒有在函數的任何地方指定函數應該返回的內容。這可以按照您顯示在R中的命令提示符下創建的對象的相同方式完成:輸入對象的名稱。或者,您可以使用return()

換句話說,修改您的函數,如下所示(我已經改變「DF」爲「是myDF」和「數據」變爲「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" 
+0

堆感謝阿難! – 2013-11-17 22:02:09