我正在尝试Rcpp在运行时调试已编译的代码。很长一段时间以来,我一直试图让它无法成功地工作。这里问了一个非常相似的问题: Debugging (line by line) of Rcpp-generated DLL under Windows这提出了同样的问题,但问题和答案都远远超出了我的理解。
这是我所拥有的:
Windows 7 Pro SP1
R 3.5
Rstudio 1.1.463 with Rcpp.
Rbuild Tools from Rstudio. (c++ compiler)
Run Code Online (Sandbox Code Playgroud)
过程:在 Rstudio File->New File->C++ File(创建一个带有 timesTwo 函数的示例文件。)
我在这个文件中添加了一个新函数:
// [[Rcpp::export]]
NumericVector timesTwo2(NumericVector x) {
for(int ii = 0; ii <= x.size(); ii++)
{
x.at(ii) = x.at(ii) * 2;
}
return x;
}
Run Code Online (Sandbox Code Playgroud)
我在 Save 上检查了 Source 并将文件保存为 RcppTest.cpp ,它成功地获取或编译了文件。
在 Rstudio 中运行代码:
data = c(1:10)
data
[1] 1 2 3 …Run Code Online (Sandbox Code Playgroud) 假设我有以下基本电子表格:
A B C D
1 -2 4 2 12
2 -1 1 0
3 0 0 0 22
4 1 1 2 12
5 2 4 6
6 3 9 12
Run Code Online (Sandbox Code Playgroud)
A 列包含从 -2 到 3 的整数。
B 列具有 a 列值的平方。
C 列是 A 和 B 的行总和,因此 C1 为 =SUM(A1:B1)。
D1 有=MAX(C1:C6),这个最大值是我需要用一个公式得到的结果。
D3 是通过 Ctrl+Shift+Enter 输入的 =MAX(SUM(A1:B6)),但它只是得到常规总和。D4 是 =MAX(A1:A6+B1:B6) 并按 ctrl+shift+enter,这样可以得到正确的结果 12。
然而,D4 的问题是我需要能够处理大动态范围,而无需输入无穷无尽的总和。假设 SUM(A1:Z1000) 将为 A1:A1000+B1:B1000+....+Z1:Z1000,这不是一个合理的公式。
那么我怎样才能做类似 =MAX(SUM(A1:Z1000)) 的事情,以便它将行 A1:Z1 到 A1000:Z1000 求和并给出最终的行宽度最大值。
我只能使用基本 Excel,因此没有辅助列,也没有 VBA 函数。
更新 …
随着R 4.0.0和最近R 4.0.1最近发布,我想知道如何升级?
以前我使用 installR 包中的 UpdateR。
升级到 4.x 也能正常工作吗?
4.0.0 的文档指出:
在此版本 (4.0.0) 的 R 下需要(重新)安装软件包
updateR 会重新安装所有东西,如果没有,我怎样才能在合理的时间内获得要安装的软件包列表。
我不敢相信我在其他地方找不到任何 4.x 安装或更新详细信息,最重要的是 3.x 中的 4.x 中是否存在任何特定问题或限制或代码更改。
另外我用Rbuild工具RCPP。我是否需要将这些工具也更新到 4.0,是否有特殊的方法可以这样做?
我使用以下命令生成了基本的 xts 对象。
library(quantmod)
temp1 <- getSymbols("GOOG",src = 'yahoo',from=Sys.Date()-50,to = Sys.Date(),auto.assign=FALSE)
temp2 <- temp1$GOOG.Close
head(temp2)
GOOG.Close
2020-05-20 1406.72
2020-05-21 1402.80
2020-05-22 1410.42
2020-05-26 1417.02
2020-05-27 1417.84
2020-05-28 1416.73
lag(temp2,1)
Error in c.xts(NA_real_, c(1406.719971, 1402.800049, 1410.420044, 1417.02002, :
zero-length vectors with non-zero-length index are not allowed
Run Code Online (Sandbox Code Playgroud)
据我所知 temp2 的长度不为零,所以我不明白这个错误。
同样, diff(temp2) 函数确实按预期工作。
这似乎是我最近更新到 R 4.0.1 时开始的
考虑到我确实有一个非零向量,我找不到对此错误的任何解释。
我在R中有一个非常大的xts对象,Data每天有10或100行和数百万行.
这是我目前的代码:
Data #my xts data set.
myDate <- "2018-02-15"
if(nrow(Data[as.character(myDate)]) > 0)
#Run code.
Run Code Online (Sandbox Code Playgroud)
问题是1天的子集有数百万行并且需要花费大量时间,特别是如果我检查许多日期.
有没有办法可以检查日期是否存在,或者只是第一次出现日期,这样我就不会浪费时间提取大量数据?
我想在原生R中做到这一点,但Rcpp解决方案是最受欢迎的.
谢谢.
编辑:从ngm的回答我能够完成一个Rcpp解决方案.
// [[Rcpp::export]]
bool doesDateExist(const Rcpp::NumericMatrix& Data, double startDate, double maxDiff = 86400)
{
double endDate = startDate + maxDiff;
NumericVector time = Data.attr("index");
for(int ii = 0; ii < Data.nrow();ii++)
{
if(time(ii) >= startDate)
{
if(time(ii) < endDate)
return true;
else
return false;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
要使用它,我有:
myDate <-as.POSIXct("2018-02-15", tz = indexTZ(Data))
if(doesDateExist(Data, myDate, 86400))
#Run …Run Code Online (Sandbox Code Playgroud)