高级:为什么 ?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:::.tryHelpfunction(){} 是对 function 的调用 utils:::.tryHelp("function") 打开帮助文件。


奖金

@rawr 想知道为什么 ?cars[1] 不起作用,我没有仔细研究它,但一眼就能看到代码在 .helpForCall:[=28 中采取不同路径的地方=]

flow::flow_debugonce(utils:::.helpForCall, out = "png")
?mtcars[1]