以下是RStudio中带有RMarkdown文件的一些实验:
---
title: "test"
author: "qed"
date: "10/10/2016"
output: html_document
---
```{r}
library(ISLR)
set.seed(3)
Wage$age = jitter(Wage$age)
get_breaks = function(cutted) {
labels = levels(cutted)
lower = as.numeric(sub("\\((.+),.*", "\\1", labels))
upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labels[length(labels)]))
c(lower, upper)
}
age_groups = cut(Wage$age, 4)
age_groups1 = cut(Wage$age, get_breaks(age_groups))
all(levels(age_groups) == levels(age_groups1))
idx = which(age_groups != age_groups1)
idx # not empty!
```
如果你编织它,你会发现idx不是空的。
RStudio版本0.99.903
R版本3.3.1
Essentailly,我试图从cut函数的输出中提取中断并显式应用它。预计新输出应与旧输出完全相同,但它们不是。
这是一个错误吗?如何解决?
实际上,在R控制台中反复尝试之后,同样的问题也存在,所以它不是RStudio错误。更令人不安的是,尽管set.seed
,这种行为似乎并不具有确定性。
答案 0 :(得分:1)
你认为切割矢量的两种方法是等价的,但它们不是。此问题与RStudio或 knitr 无关。在正常的R会话中很容易显示问题:
problem = function() {
library(ISLR)
set.seed(NULL) # reinitialize random seed
Wage$age.jittered = jitter(Wage$age)
get_breaks = function(cutted) {
labels = levels(cutted)
lower = as.numeric(sub("\\((.+),.*", "\\1", labels))
upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labels[length(labels)]))
c(lower, upper)
}
age_groups = cut(Wage$age.jittered, 4)
age_groups1 = cut(Wage$age.jittered, get_breaks(age_groups))
all(levels(age_groups) == levels(age_groups1))
idx = which(age_groups != age_groups1)
length(idx)
}
res = replicate(1000, problem())
barplot(table(res))
您希望条形图在0处只有非零频率,但idx
的长度在很多时候都不为零。
回到你的问题,你看到的标签不一定是确切的终点。他们可以圆润。请参阅帮助页dig.lab
中的参数?cut
。