粘贴函数体中使用的函数参数的名称

时间:2013-02-07 21:36:12

标签: r

我试图在函数体内连接函数的参数,以便在bode中进一步评估。我经历了许多代码改进试图解决问题但不能。

Example:在提供fun(x,y)等函数调用时,我希望能够将我为x输入的字符粘贴到$以及我输入的字符y调用数据集中的字段进行分析。因此,如果我为参数car提供了字符x,并为参数toyota提供了y,那么我将获得car$toyota变量名称以在功能

我试过了:

gtData <- function(data,field,k)
d <- diff(data$field)  ## I also tried sum(data$field) to eliminate issues with diff()

但是d评估为0 ##我知道这不是因为当我运行代码diff(car$toyota)时,我得到了正确的答案。我不认为它做我想做的事。我还尝试将参数粘贴到正文中,如下所示:

gtData(data,field,k)
a <- paste(data,"$",field)

抱怨toyota不存在,因为toyota不是数据集,而是数据集中的字段。

我尝试了很多其他变体,似乎paste()不能做我想要它做的事情。

我想要得到的是字符串car$toyota所以我可以将它作为变量进一步传递到身体以进行进一步评估。

2 个答案:

答案 0 :(得分:8)

记住fortune(312)

是件好事
The problem here is that the $ notation is a magical shortcut and like any other magic if used incorrectly
is likely to do the programmatic equivalent of turning yourself into a toad.
   -- Greg Snow (in response to a user that wanted to access a column whose name is stored in y via x$y
      rather than x[[y]])
      R-help (February 2012)

您想要的是[[而不是$

gtData <- function(data,field,k){
  a <- data[[field]]
}

粘贴绝对是错误的。

编辑 - 部分匹配

如果您想允许部分匹配,可以将exact的{​​{1}}设置为[[FALSE。来自NA

  

值NA允许部分匹配,但在发生时发出警告。值FALSE允许部分匹配而不发出任何警告。

再次

  

x $ name相当于x [[“name”,exact = FALSE]]。


根据你的意见。我认为你需要查看R manuals 2.1.8Hadley's devtools wiki函数参数和承诺

  

Promise对象是R懒惰评估机制的一部分。他们   包含三个槽:值,表达式和环境。什么时候   一个函数被称为参数匹配然后每个   形式论证必然会有一个承诺。给出的表达   对于那个正式的参数和一个指向环境的函数   被召唤的人被存储在诺言中。

     

在访问该参数之前,没有与之关联的值   诺言。访问参数时,存储的表达式为   在存储的环境中进行评估,并返回结果。该   结果也是由诺言保存的。替代功能会   提取表达式槽的内容。这允许程序员   访问值或与表达式相关联的表达式   的承诺。

所以当你通过

?`[[`

参数gtData(data = mtcars, field = mpg) 是一个promise,它在函数内访问时将具有来自调用环境的data对象的值。

如果,对于mtcars,您希望在调用环境中访问字符串field而不是与"mpg"相关联的值,如手册中所述,这是执行此操作的惯用方法是使用mpg

例如

deparse(substitute())

如果您认为可以在函数中访问gtData <- function(data,field,k){ fieldChar <- deparse(substitute(field)) a <- data[[fieldChar]] } ,在这种情况下会对其进行评估,并且会发出错误(如果调用中不存在)环境),或者 定义

时可能是非预期的值

答案 1 :(得分:0)

感谢mnel,我意识到使用$代替“[”是问题。他还提供了很好的参考资料。

但解决方案很简单。不应该使用它的名称来调用函数内部的字段,而应该通过它的编号来调用它。所以数据[,x]没有问题。

谢谢mnel