Rscript - knitr: функция substr работает некорректно внутри фрагмента кода knitr
Следующий код не работает правильно внутри книта кода (он не извлекает нужную подстроку):
Что может быть причиной такого поведения?
#Retrieve the earliest date
earlydate <- min(time(month[1]), "2016-04-20")
earlydate
#Extract YYYY-MM from earliest date
substr(earlydate, 1, 7)
где месяц [1]
TSLA.Open TSLA.High TSLA.Low TSLA.Close TSLA.Volume TSLA.Adjusted
2016-02-16 158.7 162.95 154.11 155.17 5556300 155.17
#extracts the date:
time( month[1] )
2016-02-16
Ожидайте увидеть следующее в выводе knitr (R Markdown):
## [1] 2016-02
Вместо этого фактический вывод не извлекается, просто покажите оригинальный текст:
## [1] 2016-02-16
Однако любое из следующих действий работает правильно (извлекает YYYY-MM):
#inline r code
`r substr("2016-02-16", 1,7)`
выходы: ## [1] 2016-04
#knitr code chunk
```{r test, message=FALSE, warning=FALSE}
earlydate <- "2016-02-16"
earlydate
#Extract YYYY-MM from earliest date
substr(earlydate, 1, 7)
```
выходы: ## [1] 2016-04
Сведения о классе Когда оба аргумента имеют тип Date
#Retrieve the earliest date
earlydate <- min(time(month[1]), as.Date("2016-04-20"))
class(earlydate)
## [1] "Date"
Когда один тип даты, а другой тип "символ"
#Retrieve the earliest date
earlydate <- min(time(month[1]), "2016-04-20")
class(earlydate)
## [1] "Date"
Дополнительная информация
Среда
OS: Win7
RStudio Version 0.99.892
Rx64 3.2.4 (R version)
document type: shiny knitr doc (.Rmd)
Library: quantmod
Library: knitr
Функция substr, кажется, не извлекает подстроку в блестящем документе Rmd knitr.
Подробности в следующей ссылке на стека потока:
Rscript - knitr: функция substr работает некорректно внутри фрагмента кода knitr
Минимальный воспроизводимый пример (это не извлекает искомую подстроку):
substr( min( as.Date(2013-03-14), "2016-04-20"), 1,7)
outputs: ## [1] "2013-03-14"
Ожидайте (это работает как ожидалось):
substr( min( as.Date(2013-03-14), as.Date("2016-04-20")), 1,7)
outputs (desired): ## [1] "2013-03"
Это кажется не связанным с knitr, так как это поведение также замечено на консоли R. Возвращенные классы (как указано выше) и обработка данных, похоже, не коррелируют. Казалось бы, основная проблема R.
Это WAD?
BR / К.К.
1 ответ
Во-первых, чтобы показать, что означает минимальный автономный воспроизводимый пример, это все, что вам нужно для демонстрации проблемы:
x1 = as.Date('2013-03-14')
x2 = min(x1, '2016-04-20')
substr(x1, 1, 7) # "2013-03"
substr(x2, 1, 7) # "2013-03-14"
Чтобы исследовать проблему, взгляните на то, что на самом деле представляют собой эти объекты:
dput(x1, '') # structure(15778, class = "Date")
dput(x2, '') # structure("15778", class = "Date")
x2
по сути, строка символов "15778"
замаскированный классом Date
, Что это значит? Я не знаю (даты часто представлены в виде целых чисел, а не символов). Это просто странный объект, возвращаемый min()
, когда вы попросили минимум даты и символьной строки (я не знаю, что это значит, но R все равно что-то возвращает).
Почему этот объект может быть проблематичным? Взгляните на исходный код substr()
:
> substr
function (x, start, stop)
{
if (!is.character(x))
x <- as.character(x)
.Internal(substr(x, as.integer(start), as.integer(stop)))
}
is.character(x2)
является TRUE
, поэтому он не приводится к символу, затем он передается внутренней функции (предположительно, далее передается определенной функции C), и я не собираюсь копать глубже, так как урок должен быть ясен сейчас: не сравнивайте яблоки с апельсинами. Например, если вы хотите минимум две даты, убедитесь, что оба значения действительно являются датами:
x2 = min(x1, as.Date('2016-04-20'))
Другой возможностью является явное приведение данных к определенному типу, например, в этом случае вы хотите сделать substr()
на символьной строке, поэтому убедитесь, что это действительно символ:
substr(as.character(x2), 1, 7)
В любом случае решается ваша первоначальная проблема, но рекомендуется первый.