R 返回后为什么要使用表达式';检查s括号的词法正确性,但不进行计算?
考虑以下代码:R 返回后为什么要使用表达式';检查s括号的词法正确性,但不进行计算?,r,R,考虑以下代码: a = function() { return (23) } b = function() { return (23) * 23 } c = function() { return (23) * someUndefinedVariable } 以上所有操作都成功运行(如果调用)并返回23。 我假设R忽略了return的右括号后面的所有内容,但事实并非如此,因为此代码在代码加载过程中失败: d = function() { return (23) somethin
a = function() {
return (23)
}
b = function() {
return (23) * 23
}
c = function() {
return (23) * someUndefinedVariable
}
以上所有操作都成功运行(如果调用)并返回23。
我假设R忽略了return
的右括号后面的所有内容,但事实并非如此,因为此代码在代码加载过程中失败:
d = function() {
return (23) something
}
我的假设是,在后一个示例中,某些词法分析器或解析器失败。但在前者中,表达式被解析为(return(23))*some
(因为return
被视为一个函数),但求值在return
处停止,因此R不会尝试查找some
听起来可以吗?这就是原因吗?这样的行为是故意的吗?我是否可以启用一些警告,以便解释器告诉我此类“无法访问的代码”?此代码的失败:
d = function() {
return (23) something
}
。。。与前面的代码无关,与无法解析有关:返回(23)某物
。与先前错误地试图重新定义具有有效/可解析函数体的c
不同,d
-函数体无法转换为函数形式。解析器并不是在返回(23)时真正停止,而是在它标记了某个东西之后,“意识到”它不是分号或中缀函数名。因此,R解释器现在有两个表达式,它们之间没有有效的连接器/分隔符
在定义时,R函数体内部的引用对象不会在参数列表中或函数外部进行求值或检查。(R不是编译器。)R在对语句求值之前解析语句:
parse(text = "funky <- function(x) {
return(x) * dog
}")
parse(text=“funkyreturn
不仅仅是“像函数一样对待”,它是一个函数。无论何时调用它,代码路径都将从您当时使用的任何函数中退出
这意味着当R
将return
的结果乘以23时,一切都结束了,评估停止了,没有错误或警告要报告(就像在某个if
条件中返回时没有警告或错误一样)
然而,您的上一个函数根本无法解析(这或多或少意味着表达式被放入函数树中),因此(函数)无法创建对象。为什么要重新定义c
?这应该相当于在高速公路上行驶时换成倒车档。惰性评估。除非需要使用变量,否则不会对其进行评估…并且一旦出现return()
ed函数结束了,所以不需要使用其他任何东西。对于最后一个例子,正如BondedDust回答的,它的语法无效,这是不同的。@Davidernburg,确切地说,我在给例子编号。嗯,我的注释是如何删除的?不,至少对第一句话后的材料是“否”,我对问题的解释是为什么d I我不知道你的意思。前两段是关于OP中的函数a-c。提问者似乎理解并接受了这一点。
expression(funky <- function(x) {
return(x) * dog
})
parse(text = "funky <- function(x) {
return(x) dog
}")
Error in parse(text = "funky <- function(x) {\n return(x) dog\n}") :
<text>:2:19: unexpected symbol
1: funky <- function(x) {
2: return(x) dog
^