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)

В любом случае решается ваша первоначальная проблема, но рекомендуется первый.

Другие вопросы по тегам