最近仔细看了下 tidyverse 的一些方法,发现里面大量用到了 quasiquotation 。 每个函数都是个黑盒子,不结合文档完全没法知道该输入什么类型的变量。
于是顺手写了个例子来测试一下。
几乎所有编程语言中符号( Symbol )和字符串( String )是不同的概念,传递一个符号个函数,常理是传递符号后面的变量;而传递一个字符串,传递的是字符串本身。例如这样一个最简单的案例:
f1 <- function(x) {
print(x)
}
x <- "hello"
f1(x)
# [1] hello
f1("x")
# [1] x
但是在 R 语言中,可以用封装出这样一个函数,使得结果和常理完全相背。
f2 <- function(x) {
if (is.name(substitute(x))) {
print(as.character(substitute(x)))
} else {
print(eval(as.name(x), envir = .GlobalEnv))
}
}
x <- "hello"
f2(x)
# [1] x
f2("x")
# [1] hello
导致结果就是软件的开发者可以随心所欲,软件的使用者一脸懵逼。
我想知道这个是不是 R 语言中特有的?其他语言能否也实现这样一个函数,在用户“无感”的情况下,把字符串和符号进行对换?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.