2017-01-10 70 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