2017-04-13 49 views
0

誰能告訴我,爲什麼當它被用來幾個數據幀中的一個之間進行選擇,以輸出從功能[R評估和演示問題與函數的返回

例如返回使用eval(parse(text=xxxx))失敗我有一個函數內生成三個數據框;

aaa.df,bbb.df,ccc.df

和一個 '模式' 例如參數AAA/BBB/CCC(其表示在這種情況下,從函數返回的數據幀)

以下兩班輪工作正常

eval(parse(text=paste("output.df<-",mode,".df", sep=""))) 
return(output.df) 

然而,當我嘗試純粹冷凝這兩條線用於幾乎沒有增加簡潔性,將中間分配移除到output.df,它不會輸出數據幀

eg

eval(parse(text=paste("return(",mode,".df)", sep=""))) 

這不會是一個大問題,我繼續與第一種方法,直到我結束了一個非常大的數據幀返回,在這一點上,我認爲可能會有一些性能/內存命中。

+0

很難說,因爲你沒有提供足夠的,所以我們可以重新創建你的問題。但是,你是否試圖在整個表情中加上括號? '(eval(parse(text = paste(「return(」,mode,「。df)」,sep =「」))))' – Jake

+0

沒有嘗試tbh。我會認爲(儘管現在你認爲我不那麼自信),用這樣的括號包裝整個表達式對代碼執行完全沒有影響。但是也許有一點我在這裏錯過的R語法...... – Pascoe

+0

當然有更好的方法來選擇從函數返回哪個data.frame。在R代碼中''eval(parse())'通常是一個壞主意。即使是一個簡單的'get()'在這裏可能會更好。 – MrFlick

回答

2

只要刪除return,這是完全沒有必要的,也沒有誠意。

eval(parse(text=paste0(mode,".df"))) 

更好的是,在這裏不要使用eval--這可能是最糟糕的解決方案。相反,將數據放入結構化表格或列表格式。或者,最壞的情況下,使用get

get(paste0(mode, '.df')) 

不過說真的,只是把數據放到命名列表。

+0

刪除返回在eval結構中似乎不起作用。然後返回(get ... does work。所以謝謝你,Upvoting。乾杯... – Pascoe

+0

和paste0的+1也可以停止使用sep =「」 - 也讚賞 – Pascoe

+1

@Pascoe是的,刪除'return ''什麼都不做*因爲'return'本身在這裏什麼也不做*就像我說的那樣,它只是無用的。順便說一句,和'get'一起使用時,*也是*不必要的,除非你想提早退出函數。 –