来自C/Python/Java背景,我无法理解一些R语法,其中文字看起来像变量,但似乎表现得像字符串.例如:
library(ggplot2)
library("ggplot2")
Run Code Online (Sandbox Code Playgroud)
这两条线的行为相当.但是,我希望第一行的意思是"加载名称存储在ggplot2变量中的库"并给出类似的错误object 'ggplot2' not found.
说到ggplot2:
ggplot(data, aes(factor(arrivalRate), responseTime, fill=factor(mode))) +
geom_violin(trim=FALSE, position=dodge)
Run Code Online (Sandbox Code Playgroud)
变量arrivalRate,responseTime并且mode不存在,但不知何故[R知道找一找里面data的数据帧.我假设aes实际上接收字符串,然后使用类似的东西进行处理eval.
R如何解析代码,最终将一些文字解释为字符串?
到目前为止,在编写R函数时,我将未定义的参数作为NULL值传递,然后测试它们是否为NULL即
f1 <- function (x = NULL) {
if(is.null(x))
...
}
Run Code Online (Sandbox Code Playgroud)
但是我最近发现了将未定义的参数传递为缺失的可能性
f2 <- function (x) {
if(missing(x))
...
}
Run Code Online (Sandbox Code Playgroud)
R文件说明了这一点
当前缺失只能在定义参数的函数的直接主体中使用,而不能在嵌套函数或本地调用的主体中使用.这可能在将来发生变化.
显然,这是使用缺失来确定未定义值的一个缺点是否有其他人或意识到?或者以更有用的形式表达问题"你何时使用缺失与NULL值来传递R中未定义的函数参数?为什么?"
我有一个函数,如果一个非空值提供给另一个可选参数,它会做额外的事情.如果未提供参数,则该函数不会执行任何额外操作.
使用NA或更好NULL吗?两者有什么好处?
例如,如果我使用NA,那么我可以快速检查哪些参数不是通过使用:is.na(as.list(environment()))在函数体中提供的,它不起作用is.null.
这是我想要使用的原因的一个例子 NA
我正在尝试构建一个到Geckoboard条形图API的R连接器.它有许多可选参数.如果我执行以下操作,则使用该包jsonlite提供可选参数非常容易.
get_barchart_json <- function(data, x_axis = list(labels = NA, type = NA), y_axis = list(format = NULL, unit = NULL)){
payload <- "{"
textappend(payload) <- '"series": [{"data":['
textappend(payload) <- paste0(data, collapse = ",")
textappend(payload) <- ']}]'
if(any(!is.na(x_axis))){
textappend(payload) <- ","
textappend(payload) <- jsonlite::toJSON(x_axis, auto_unbox = TRUE)
}
if(any(!is.na(y_axis))){
textappend(payload) <- ","
textappend(payload) <- jsonlite::toJSON(y_axis, auto_unbox = TRUE)
}
# finish construction …Run Code Online (Sandbox Code Playgroud) 国家的文件do.call:
如果
quote是FALSE,默认值,则对参数求值(在调用环境中,而不是在 中envir)。
这句话向我暗示, when quote = FALSE,指定envir没有区别。然而,事实并非如此,事实上我遇到过需要指定envir才能使函数工作的情况。
最简单的可重现示例:
g1 <- function(x) {
args <- as.list(match.call())
args[[1]] <- NULL # remove the function call
do.call(print, args, quote = FALSE) # call print()
}
g2 <- function(x) {
args <- as.list(match.call())
args[[1]] <- NULL # remove the function call
do.call(print, args, quote = FALSE, envir = parent.frame()) # call print(), specifying envir
}
h1 <- function(x, y) { …Run Code Online (Sandbox Code Playgroud)