我试图在函数体内连接函数的参数,以便在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
所以我可以将它作为变量进一步传递到身体以进行进一步评估。
答案 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.8和Hadley'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