Rscript - knitr:substr函数在knitr代码块中无法正常工作

时间:2016-04-28 02:06:09

标签: r knitr rscript

以下代码在knitr代码块内部无法正常工作(它不会提取所需的子字符串):

可能导致此行为的原因是什么?

$Computers = Get-Content computername.txt 

Get-WMIobject -Computername $Computers win32_service |
 Where-Object {$_.startname -ne "LocalSystem" -and $_.startname -ne "localservice" -and $_.startname -notlike "*AUTHORITY*"} |
 ft PSComputerName, name, startname, startmode, state |
 Out-string |
 Out-File ServiceReport.txt

月份[1]是

#Retrieve the earliest date
 earlydate <- min(time(month[1]), "2016-04-20")

 earlydate

 #Extract YYYY-MM from earliest date
 substr(earlydate, 1, 7)

期望在knitr输出中看到以下内容(R Markdown):

            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

而不是提取实际输出,只显示原始文本:

## [1] 2016-02

但是,以下任一方法都能正常工作(提取YYYY-MM):

## [1] 2016-02-16

输出: ## [1] 2016-04

#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)

```

当一个是类型日期而另一个类型是&#34;字符&#34;

#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"

substr函数似乎不会在闪亮的knitr Rmd文档中提取子字符串。

详细信息位于以下stackflow链接中:

Rscript - knitr: substr function not working correctly inside knitr code chunk

最小可重现示例(这不会提取所需的子字符串):

OS: Win7

RStudio Version 0.99.892

Rx64 3.2.4 (R version)

document type: shiny knitr doc (.Rmd)

Library: quantmod

Library: knitr

期待(这可以按预期工作):

substr( min( as.Date(2013-03-14), "2016-04-20"), 1,7)
outputs: ## [1] "2013-03-14"

它似乎与knitr无关,因为在R控制台上也可以看到这种行为。返回的类(如上所述)和数据处理似乎不相关。它似乎是潜在的 R问题

这是WAD吗?

BR / KK

1 个答案:

答案 0 :(得分:2)

首先,要显示最小的自包含可重现示例的含义,这就是展示问题所需的全部内容:

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)

无论哪种方式都能解决您的原始问题,但建议采用第一种方式。