R语言工作空间值得就是交互框,之前我们已经简单介绍过那个交互框的功能。在这里我们详细地梳理一下:
运行代码
毫无疑问,你可以直接输入,复制,粘贴代码到交互框来进行运行,比如输出一个Hello World!
print("Hello World")
值得注意的是,R函数括号必须是英文字符,不能是中文的。所以“()”(英文括号)和“()“(中文括号)不是一回事儿。
作图
我们输入一行简单的做图代码:
plot(density(rnorm(1000,0,1)))
在右下角就会出现一副正态分布的曲线图像。再上面的代码里,我们首先生成了一组数据,用的是命令rnorm(1000,0,1)
,这一行命令可以基于均值0和标准差1生成1000个数据点。然后我们再这一行名另外,包裹了一层函数,density()
,这是一个用来计算数据的分布的函数。然后我们调用函数plot()
,来将这一曲线绘制出来。
查看函数说明
R语言的每一个函数都必须有说明,这是再R包上线发布之前硬性要求的,这样做的好处就是,每一个函数都会有一个相应地说明文档。在我们不知道一个函数怎么用的时候,就可以查看说明文档。调用说明文档的方法很简单,就是再函数前面加一个问好?:
?density
用上边的代码,我们就可以知道plot这个函数的功能、用法等等信息。
右下角,出现了有关于这个函数的说明文档。伴随着R包升级换代,说明文档是会发生变化的。这也是R语言的一个不足,经常你写的R包引用了别人的包,然后别人的R包更新了,导致你的程序也跟着出问题。
总而言之,无论什么时候,你搞不清一个函数是做什么的,就可以用这个方法去查询。(当然百度也是好办法)
查看源代码
R语言可以很方便地让你查看每一个函数的源代码,其实严格来说,其原因是每一个函数都是一系列复制给了一个变量,你只不过是查看了这个变量而已。不过这确实让人们可以很轻易地查看R里的函数源代码。
比如说,我们想要查看lm这个函数的源代码,只需要直接输入lm,不加括号就可以实现:
> lm
function (formula, data, subset, weights, na.action, method = "qr",
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE,
contrasts = NULL, offset, ...)
{
ret.x <- x
ret.y <- y
cl <- match.call()
mf <- match.call(expand.dots = FALSE)
m <- match(c("formula", "data", "subset", "weights", "na.action",
"offset"), names(mf), 0L)
mf <- mf[c(1L, m)]
mf$drop.unused.levels <- TRUE
mf[[1L]] <- quote(stats::model.frame)
mf <- eval(mf, parent.frame())
if (method == "model.frame")
return(mf)
else if (method != "qr")
warning(gettextf("method = '%s' is not supported. Using 'qr'",
method), domain = NA)
mt <- attr(mf, "terms")
y <- model.response(mf, "numeric")
w <- as.vector(model.weights(mf))
if (!is.null(w) && !is.numeric(w))
stop("'weights' must be a numeric vector")
offset <- as.vector(model.offset(mf))
if (!is.null(offset)) {
if (length(offset) != NROW(y))
stop(gettextf("number of offsets is %d, should equal %d (number of observations)",
length(offset), NROW(y)), domain = NA)
}
if (is.empty.model(mt)) {
x <- NULL
z <- list(coefficients = if (is.matrix(y)) matrix(, 0,
3) else numeric(), residuals = y, fitted.values = 0 *
y, weights = w, rank = 0L, df.residual = if (!is.null(w)) sum(w !=
0) else if (is.matrix(y)) nrow(y) else length(y))
if (!is.null(offset)) {
z$fitted.values <- offset
z$residuals <- y - offset
}
}
else {
x <- model.matrix(mt, mf, contrasts)
z <- if (is.null(w))
lm.fit(x, y, offset = offset, singular.ok = singular.ok,
...)
else lm.wfit(x, y, w, offset = offset, singular.ok = singular.ok,
...)
}
class(z) <- c(if (is.matrix(y)) "mlm", "lm")
z$na.action <- attr(mf, "na.action")
z$offset <- offset
z$contrasts <- attr(x, "contrasts")
z$xlevels <- .getXlevels(mt, mf)
z$call <- cl
z$terms <- mt
if (model)
z$model <- mf
if (ret.x)
z$x <- x
if (ret.y)
z$y <- y
if (!qr)
z$qr <- NULL
z
}
<bytecode: 0x000000000605d848>
<environment: namespace:stats>
>
运行脚本
再很多时候,你不想每一次跑程序都很重新些,也不想要复制粘贴。所以可以写成R脚本的形式,然后直接运行。R脚本就是普通的文件,只需要再命名文件的时候,结尾用.R来结尾就行了。运行R脚本的方式有很多,不过最常用的大概有两种,一个与交互框有关——通过source()命令运行,另一种是直接再bash命令中调用Rscript运行。
区别在于,前一种运行完了,所有结果都会被保存下来再交互框中。而后一个什么也不会留下。
下面假设我们写了一个小的R脚本,命名为a.R:
点击以后,左上方的区域就会变成写脚本的地方,然后脚本内容如下:
# Test Script by Yuan Tian
data(iris)
summary(iris)
boxplot(iris[,1:4])
plot(hclust(dist((iris[,1:4]))))
保存的时候,RSutdio会提示你保存的位置,我建议就在默认目录。
然后再下方的console框,我们输入source("./TestScript.R")
就可以运行这个脚本:
其实我们输出了两幅图,但是右边只能看到一副,因为前一副被盖掉了。如果程序有错,source运行的时候,会报错的。
基本上上述就是R交互框的使用方法,这是R语言中最重要也是最常用的工具。