2017-01-10 30 views
-1

我想構建一個函數,調用另一個名稱與主對象名相關的對象。R函數使用傳遞的對象名+內部的其他名稱

例如,主要對象是「VCU_Players」和另一對象是「VCU_Players_opp」

在我的功能,我需要在我的計算中使用兩個對象。

,所以我試圖做

my_function<- function(x) { 
    y<-deparse(substitute(x)) 
    z<-"_opp" 
    y<- paste(y,z,sep = "") 

#My Calculations 
x$newfield<- x$pts+ y$pts 
Return(x) 
} 

現在我想的對象VCU_Players傳遞給函數

創建my_function(VCU_Players)

但功能不圖的VCU_Players_opp對象

+0

這使我不知道,如果你有很多如果不是幾百個這樣的配對充斥你的全球環境。如果是這樣,請考慮將它們全部納入帶有可用字符串文字引用的命名元素的大列表中。建議您更大的設置。 – Parfait

+0

嗨謝謝你的回覆,但你能舉個例子嗎? –

+0

你能給我你的設置嗎?同樣,你是否有許多這樣的VCU以外的* _players *和* _opp *對象?他們是如何製作的?從循環?從文件?一旦我知道我可以幫忙。 – Parfait

回答

0

考慮傳遞字符串文字並使用get()來檢索相應的對象:

teams <- c("Team1", "Team2", "Team3", "Team4", "Team5", "Team6", 
      "Team7", "Team8", "Team9", "Team10", "Team11", "Team12") 

my_function <- function(i) { 
    x <- get(paste0(i, "_players")) 
    y <- get(paste0(i, "_opp")) 

    # My Calculations 
    x$newfield <- x$pts + y$pts  
    return(x) 
} 

dfList <- lapply(teams, my_function) 

然而,理想情況下,使用多個對象的列表工作,而不是在全局環境中分隔多個對象。嘗試從數據源(即Excel)中的多個對象導入到一個列表:

teamdfs <- c(Team1_players, Team2_players, Team3_players, Team4_players, Team5_players, Team6_players, 
      Team7_players, Team8_players, Team9_players, Team10_players, Team11_players, Team12_players) 

team_oppdfs <- c(Team1_opp, Team2_opp, Team3_opp, Team4_opp, Team5_opp, Team6_opp, 
       Team7_opp, Team8_opp, Team9_opp, Team10_opp, Team11_opp, Team12_opp) 

my_function <- function(x, y) { 
    # My Calculations 
    x$newfield <- x$pts + y$pts 
    return(x) 
} 

dfList <- mapply(my_function, teamdfs, team_oppdfs, SIMPLIFY = FALSE) 
      # EQUIVALENT TO Map(my_function, teamdfs, team_oppdfs) 
+0

感謝您的評論,當我嘗試這個(get(paste0(i,「_opp」)))在它工作的功能之外。但是,當我將它包含在函數中時,它會給出錯誤:get(paste0(「x」,「_opp」)):找不到對象'x_opp'中的錯誤。當我嘗試沒有「」的x時,它給出了一個錯誤:get(paste0(x,「_opp」)中的錯誤): object'c(1,12,4,10,2,20,5,0,23 ,13,15,14)_opp'找不到 –

+0

我用這個例程檢查了我的模擬數據,沒有使用'get()'的問題。你能仔細檢查名字嗎?你在這裏改變'i'和'x'。請注意:R區分大小寫。與您在此處可能有所不同的實際對象名稱對齊。 – Parfait

+0

沒有運氣?你爲什麼用'x'甚至更多,你爲什麼要引用它?我的解決方案使用編號組。一定要改成實際的團隊名稱,例如* VCU *。另外,看起來你正在將實際的對象傳遞給函數。對於第一個「lapply」解決方案,傳遞團隊名稱字符串列表。對於'mapply',傳遞實際的對象(dfs列表)。 – Parfait

相關問題