如何接受不带引号的文本/字符参数

Posted

技术标签:

【中文标题】如何接受不带引号的文本/字符参数【英文标题】:How to take in text/character argument without quotes 【发布时间】:2012-10-13 22:57:00 【问题描述】:

抱歉,如果问题不清楚。随意更改它。

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

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)

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

【问题讨论】:

您是否需要 both foo(Sex, Fold, survey)foo(1, 5, survey) 才能使用相同的功能? 是的。如果可以的话,那就太好了! 【参考方案1】:

好吧,这将适用于符号:

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

如果您希望它也适用于带引号的变量名和整数索引,您可以简单地在开始时检查 xy,并使用一些简单的 if-else 分支。

但它带有标准警告,即eval(substitute()) 成语使用起来可能很危险。 (在某些情况下,您可能无法始终预测它不会如何工作,并且当它不起作用时,您可能无法意识到。)

【讨论】:

您能否至少提及一些它何时/如何可能不起作用的情况? @civilstat 我见过的最常见的情况是在处理涉及公式的对象时,其中附加到公式的环境很重要,因此如果您对保留有关信息不是很小心eval() 将无法工作或给出非常意外的结果。 谢谢。乍一看,公式似乎是 eval(substitute()) 的自然用例,因此知道这是有问题的非常有帮助! @civilstat 好吧,你说得对,例如,model.frame 使用eval(但并非在所有情况下都可以替代)。人们通常只是忘记了substitute also 有一个环境参数,所以当他们尝试用自己的方式重新使用作为参数传递给函数的公式时,事情很快就会变得非常复杂。【参考方案2】:

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

当您说 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)

【讨论】:

以上是关于如何接受不带引号的文本/字符参数的主要内容,如果未能解决你的问题,请参考以下文章

SQLite插入 - 如何使用参数化值避免语法错误时插入任何文本

怎样区分JS的函数中参数带引号与不带引号?

涉及变量引用和子表达式的参数模式中不带引号的标记:为啥它们有时会分成多个参数?

springmvc 接受json参数的坑

强制 Http Get 接受带参数或不带参数的请求

如何将字符串转换为日期 pandas python TypeError:strptime() 不接受关键字参数