高级:为什么 ?function(){} 在 R 中有效
Advanced: Why ?function(){} works in R
我了解 R 中的某些运算符和函数在使用帮助功能之前需要反引号。但是,我不明白为什么 ?function(){}
也有效。有人知道吗?
如果你尝试
debugonce(`?`)
?function(){}
你会到达这条线
if (is.call(topicExpr))
return(.helpForCall(topicExpr, parent.frame()))
所以打电话
debugonce(.helpForCall)
将在 .helpForCall
中再次到达这一行
f <- expr[[1L]]
如果您检查 expr
,它是一个 ?call
,其中包含以下元素
expr
# function() {
# }
as.list(expr)
# [[1]]
# `function`
#
# [[2]]
# NULL
#
# [[3]]
# {
# }
#
# [[4]]
# function(){}
和
class(expr[[1]])
# [1] "name"
现在,如果你问我为什么
?mtcars[1]
# Error in .helpForCall(topicExpr, parent.frame()) :
?mtcars[[1]] ## works
?asdflasdflansldfnalsdf[1]
# Error in eval(argExpr, envir) : object 'asdflasdflansldfnalsdf' not found
?asdflasdflansldfnalsdf[[1]] ## works
我不知道
让我们看看使用 {flow} 包在 ?
的代码中发生了什么,它可以帮助您检查代码采用的逻辑路径(遵循完整的行):
flow::flow_run(?function(){}, out = "png")
我们看到当表达式是调用时我们调用utils:::.helpForCall
让我们看看那里发生了什么,我们不能直接调用flow::flow_run
所以我们调用flow::flow_debugonce
设置utils:::.helpForCall
并再次调用?
flow::flow_debugonce(utils:::.helpForCall, out = "png")
?function(){}
在那里我们看到,当输入是一个调用时,我们将函数名称作为字符串调用 utils:::.tryHelp
。 function(){}
是对 function
的调用
utils:::.tryHelp("function")
打开帮助文件。
奖金
@rawr 想知道为什么 ?cars[1]
不起作用,我没有仔细研究它,但一眼就能看到代码在 .helpForCall
:[=28 中采取不同路径的地方=]
flow::flow_debugonce(utils:::.helpForCall, out = "png")
?mtcars[1]
我了解 R 中的某些运算符和函数在使用帮助功能之前需要反引号。但是,我不明白为什么 ?function(){}
也有效。有人知道吗?
如果你尝试
debugonce(`?`)
?function(){}
你会到达这条线
if (is.call(topicExpr))
return(.helpForCall(topicExpr, parent.frame()))
所以打电话
debugonce(.helpForCall)
将在 .helpForCall
f <- expr[[1L]]
如果您检查 expr
,它是一个 ?call
,其中包含以下元素
expr
# function() {
# }
as.list(expr)
# [[1]]
# `function`
#
# [[2]]
# NULL
#
# [[3]]
# {
# }
#
# [[4]]
# function(){}
和
class(expr[[1]])
# [1] "name"
现在,如果你问我为什么
?mtcars[1]
# Error in .helpForCall(topicExpr, parent.frame()) :
?mtcars[[1]] ## works
?asdflasdflansldfnalsdf[1]
# Error in eval(argExpr, envir) : object 'asdflasdflansldfnalsdf' not found
?asdflasdflansldfnalsdf[[1]] ## works
我不知道
让我们看看使用 {flow} 包在 ?
的代码中发生了什么,它可以帮助您检查代码采用的逻辑路径(遵循完整的行):
flow::flow_run(?function(){}, out = "png")
我们看到当表达式是调用时我们调用utils:::.helpForCall
让我们看看那里发生了什么,我们不能直接调用flow::flow_run
所以我们调用flow::flow_debugonce
设置utils:::.helpForCall
并再次调用?
flow::flow_debugonce(utils:::.helpForCall, out = "png")
?function(){}
在那里我们看到,当输入是一个调用时,我们将函数名称作为字符串调用 utils:::.tryHelp
。 function(){}
是对 function
的调用
utils:::.tryHelp("function")
打开帮助文件。
奖金
@rawr 想知道为什么 ?cars[1]
不起作用,我没有仔细研究它,但一眼就能看到代码在 .helpForCall
:[=28 中采取不同路径的地方=]
flow::flow_debugonce(utils:::.helpForCall, out = "png")
?mtcars[1]