如何在不使用引号的情况下接收文本/字符参数

3

如果问题不清楚,请随意更改。

基本上,我正在尝试找到一种方法,使函数的文本/字符字符串参数不需要引号。

foo  = function(x, y, data){
    n1 = length(data[,x])
    n2 = length(data[,y])
    cat(n1, n1)
 }

如果我使用以下代码:
data(survey)
foo(Sex, Fold, survey)

如果我使用以下代码:

我将会收到一个错误信息。但是如果我使用如下代码:

foo("Sex", "Fold", survey)

或者

foo(1, 5, survey)

这个函数会给我想要的东西。所以我想知道是否有任何方法可以构建这个函数,以便我不需要在列名周围使用引号。谢谢!


你需要同时使用foo(Sex, Fold, survey)foo(1, 5, survey)这两个函数才能达到同样的效果吗? - joran
是的。如果可能的话,那就太好了! - Alex
2个回答

8

好的,这将与符号一起使用:

foo  = function(x,y, data){
    n1 <- length(eval(substitute(x),data))
    n2 <- length(eval(substitute(y),data))
    cat(n1,n2)  
}

如果你希望这个功能也能支持带引号的变量名和整数索引,你可以在开始时使用一些简单的if-else分支来检查x和y。但是请注意,eval(substitute())的用法可能存在危险。(有时你可能无法预料它在某些情况下不起作用,并且你可能意识不到它没有工作。)

你能否提及一些可能不起作用的情况或方式? - civilstat
1
@civilstat 我见过的最常见情况是在处理涉及公式的对象时,附加到公式的环境很重要,因此如果您不非常小心地保留有关该环境的信息,则 eval() 将无法正常工作或产生非常意外的结果。 - joran
谢谢。乍一看,公式似乎是eval(substitute())的自然用例,因此知道这是有问题的非常有帮助! - civilstat
1
@civilstat,嗯,你说得对,model.frame在某些情况下确实使用了eval(但不是在所有情况下都使用了substitute)。通常情况下,人们只是忘记了substitute也有一个环境参数,所以当他们试图自己设计一种方式来重复使用作为函数参数传递的公式时,事情很快就会变得非常复杂。 - joran

0

这与数据框中的索引[]参数有关。

当你说DF[,x]时,它告诉R从DF中选择哪一列。如果x是DF中的字面列“Sex”,它将告诉R你想要向量DF$Sex中的所有列。

因此,如果您使用“Sex”/“Fold”或1,5,那么您的函数应该保持不变。如果您想使用SexFold,那么您的函数应该是:

foo = function(x,y,data){
n1 <- length(x)
n2 <- length(y)
cat(n1,n2)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接