Debugging 在R函数中粘贴变量名

Debugging 在R函数中粘贴变量名,debugging,r,function,Debugging,R,Function,在我的帮助下 虽然我雄心勃勃,但我现在想把它变成一种功能。另外,我有很多查找表,我需要快速查找我的数据,这样一个函数就很方便了 但首先是一些样本数据,从数据框架开始 df <- data.frame(id = c(1:6), profession = c(1, 5, 4, NA, 0, 5)) df # id profession # 1 1 # 2 5 # 3 4 # 4

在我的帮助下

虽然我雄心勃勃,但我现在想把它变成一种功能。另外,我有很多查找表,我需要快速查找我的数据,这样一个函数就很方便了

但首先是一些样本数据,从数据框架开始

df <- data.frame(id = c(1:6),
                 profession = c(1, 5, 4, NA, 0, 5))

df
#  id profession
#  1          1
#  2          5
#  3          4
#  4         NA
#  5          0
#  6          5
但显然这是行不通的

ADDlookup(df, profession)
我得到了错误的混乱

Error in paste(orginalDF, "$", orginalVAR, sep = "") : 
  object 'profession' not found
现在,这就是我被卡住的地方

谁能告诉我需要阅读哪一页手册,或者是一个友好的提示来解决这个问题


感谢您的阅读。

当然有更复杂的方法让它按照您最初设想的方式工作,但简单地重新组织该函数的工作方式会简单得多:

ADDLookup <- function(originalDF,var,varLookup){
    match.idx <- match(originalDF[,var], varLookup)
    originalDF[,var] <- ifelse(is.na(match.idx), 
                        originalDF[,var], names(varLookup)[match.idx])
    originalDF
}                            

ADDLookup(df,"profession",profession.lookuptable)
  id         profession
1  1       Optometrists
2  2             Nurses
3  3 Financial analysts
4  4               <NA>
5  5                  0
6  6             Nurses

ADDLookup这是因为您正在将
profession
传递到
ADDLookup
函数中,但它还不存在

按照编写函数的方式,必须区分使用包含变量名称的字符向量和变量本身

例如,您的前几行
paste(originalDF,$',originalVAR,sep='')
似乎期望
originalDF
originalVAR
是字符串,而
DF.VAR
是字符串
'DF$professional'
。但是,当您进行
match
时,似乎希望
DF.VAR
成为变量
DF$profession

这就是我建议你如何绕过它: -作为对象传入
originalDF
,作为
df
-将
originalVAR
作为字符串传入,作为
的“profession”
(它是一个列名,因此是一个字符串)

然后,通过以下方式从数据框中检索
originalVar
中包含的列:

DF.VAR <- originalDF[,originalVAR] # e.g. df[,'profession']
这将检索名为
'profession.lookuptable'
的对象。它遵循与您直接键入
profession.lookuptable
相同的规则,因此您必须确保函数可以“看到”该对象(在您的情况下,您应该可以)

接下来,您似乎希望返回
originalDF
数据帧,其中
originalVAR
列已被查找值替换

我只需修改
originalDF[,originalVAR]
列,将其替换为查找值:

originalDF[,originalVAR] <- 
   ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
现在大家一起:

ADDlookup <- function(orginalDF, orginalVAR) {
   # retrieve the originalVAR column of originalDF
   DF.VAR <- originalDF[,originalVAR] 
   # find the variable called {originalVAR}.lookuptable
   lookup.table <- get(paste(originalVAR, "lookuptable",sep='.'))
   # look up the values
   match.idx <- match(DF.VAR, lookup.table)
   # replace the originalVAR column with the looked-up values
   originalDF[,originalVAR] <- 
       ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
   # return the modified data frame
   return(originalDF)
}
然后您可以避免整个
get(xxxx)
行(以及与之相关的所有作用域问题)

然后您可以通过以下方式调用该函数:

ADDlookup( df, 'profession', profession.lookup )

我将查找表定义为因子

df[,"profession"] <- profession.lookuptable[df[,"profession"]]

df[,“profession”]+1好的,所以没有那么复杂,但我试图避免使用
get
。是的,我也不喜欢使用
get
;我编辑了我的帖子,提到:。@mathematic.coffee哇哦,这真是信息量太大了。谢谢你花时间把这一切解释得如此透彻。可能是我,但当我运行您的代码时,当运行ADDlookup(df,“profession”)中的最后一个函数时,我确实会收到一条错误消息:未找到对象“originalDF”
。明天早上我再看一看,我现在已经很晚了。再次感谢你抽出时间,我肯定会重读你的文章(好几次)。谢谢谢谢你抽出时间来收拾我的烂摊子。我不确定我是否完全理解这一切,但工作已经完成了。谢谢函数中的所有
df
不都应该替换为
originalDF
originalDF[,originalVAR] <- 
   ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
return(originalDF)
ADDlookup <- function(orginalDF, orginalVAR) {
   # retrieve the originalVAR column of originalDF
   DF.VAR <- originalDF[,originalVAR] 
   # find the variable called {originalVAR}.lookuptable
   lookup.table <- get(paste(originalVAR, "lookuptable",sep='.'))
   # look up the values
   match.idx <- match(DF.VAR, lookup.table)
   # replace the originalVAR column with the looked-up values
   originalDF[,originalVAR] <- 
       ifelse(is.na(match.idx), DF.VAR, names(lookup.table)[match.idx])
   # return the modified data frame
   return(originalDF)
}
> ADDlookup(df,'profession')
  id         profession
1  1       Optometrists
2  2             Nurses
3  3 Financial analysts
4  4               <NA>
5  5                  0
6  6             Nurses
ADDlookup <- function( originalDF, originalVAR, lookup.table )
ADDlookup( df, 'profession', profession.lookup )
df[,"profession"] <- profession.lookuptable[df[,"profession"]]