我正在尝试生成一个可以计算一系列加权产品的函数
其中W是对角矩阵.有许多W矩阵但只有一个X矩阵.
为了有效,我可以将W表示为包含对角线部分的数组(w).然后在R中这将是
crossprod(X, w*X)
要不就
crossprod(X * sqrt(w))
我可以循环W系列,但这似乎效率低下.整个产品可以作为只有w改变才能回收第i列和第j列的产品X_i*X_j.我想要制作的功能看起来像这样
Rcpp::List Crossprod_sparse(Eigen::MappedSparseMatrix<double> X, Eigen::Map<Eigen::MatrixXd> W) {
int K = W.cols();
int p = X.cols();
Rcpp::List crossprods(W.cols());
for (int k = 0; k < K; k++) {
Eigen::SparseMatrix<double> matprod(p, p);
for (int i = 0; i < p; i++) {
Eigen::SparseVector<double> prod = X.col(i).cwiseProduct(W.col(k));
for (int j = i; j < p; j++) {
double out = prod.dot(X.col(j));
matprod.coeffRef(i,j) = out;
matprod.coeffRef(j,i) = out;
}
}
matprod.makeCompressed();
crossprods[k] = matprod; …Run Code Online (Sandbox Code Playgroud) 我有一些利用igraph库的c代码.我想在它周围放一个R包装并将其作为R包发送给CRAN.
igraph在CRAN上已经有一个R端口,所以我的R包'foo'依赖于R的igraph是有意义的.由于foo使用自己的C代码依赖于C igraph,我如何将我的C函数链接到原始的igraph库?我已经读过这是在一个名为Makevars的文件中完成的,但链接到外部库非常多毛.
如果这是不可能的,那么复制整个igraph源代码并将整个内容放入我的/ src目录是否更好?R igraph包已经有一个名为Makevars的文件,但我不明白所有的c文件是如何构建的 - 通常在我的Makefile中我有类似gcc(一些.c源文件列表)-o,但Makevar只包含
PKG_CFLAGS=-DUSING_R -I. -Ics -Iglpk -Iglpk/amd -Iglpk/colamd \
-g -O2 -I/usr/include/libxml2 -g -O2 -I/usr/include/libxml2 -DNDEBUG \
-DPACKAGE_VERSION=\"0.6\" -DINTERNAL_ARPACK \
-DIGRAPH_THREAD_LOCAL=/**/
PKG_CXXFLAGS= -DUSING_R -DIGRAPH_THREAD_LOCAL=/**/ -DNDEBUG
PKG_LIBS=-lxml2 -lz -lpthread -licucore -lm -lgmp $(FLIBS) $(LAPACK_LIBS) $(BLAS_LIBS)
all: $(SHLIB)
Run Code Online (Sandbox Code Playgroud)
并且没有其他Makefile.总之,如何将C代码放入依赖于另一个C库的R包中,如何编写相应的Makevars(或Makefile)来合并C函数?
我正在按照教程说明如何使用Java连接谷歌表.它使用gradle来获取依赖关系
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'Quickstart'
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.api-client:google-api-client:1.22.0'
compile 'com.google.oauth-client:google-oauth-client-jetty:1.22.0'
compile 'com.google.apis:google-api-services-sheets:v4-rev483-1.22.0'
}
Run Code Online (Sandbox Code Playgroud)
当我从IntelliJ内部运行示例QuickStart.java类时,我可以看到周围的错误
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.*;
import com.google.api.services.sheets.v4.Sheets;
Run Code Online (Sandbox Code Playgroud)
说找不到图书馆.在IntelliJ的工具栏中,我转到了文件 - >项目结构 - >依赖项,并添加了build.gradle中的3个项目.之后,围绕进口的错误消失了.当我上课时,我得到了
objc[1649]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/java (0x102cf14c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x102db94e0). One of …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用具有许多交互项的公式创建模型矩阵(一些连续,一些0-1,一些具有多个级别的因素).这个模型矩阵的创建是我脚本的瓶颈.最后,模型矩阵是8M行,1000列.由于具有多个级别的因子是0-1编码的,因此表示交互的结果矩阵非常稀疏,因此我已经使用了sparse.model.matrix.
有没有更快的方法来生成这个矩阵?也许在Rcpp?
我正在创建一个Django应用程序,并希望拥有社交网络的可视化.我正在寻找一个可以绘制图形/网络数据结构的库,但也可以使它具有交互性.我希望能够点击一个节点,并在页面上的其他位置显示该节点的信息(名称,网络等)
到目前为止,我发现python-graph和graphviz是非常强大的可视化工具,但它们创建静态图像,因此您无法单击它们.我也找到了这个帖子
这有很多建议,但其中一些是图表中的图形,而不是社交网络图形中的图形.其中一些是非常老的,其中一些是交互式的,因为节点可以被拖动并移动到画布上的其他位置.我不太关心用户能够更改图形,我只是想让节点对象携带可以在某处显示的数据.
有什么建议?
我有一个字符串x = c("hello", "world")向量和另一个向量y = c("hello", "world", "how", "are", "you")。我想看看 x 的哪些元素在 y 里面。对于小向量,这可以很容易地使用x %in% y. 但是,我正在寻找一种更有效的方法来执行此操作 - 通常我们会先O(n log n)及时对 y 进行排序,然后在 x 中使用 foreach 字符串,我们可以及时进行查找O(log n)。我担心 %in% 正在对它查找的每个 x 进行完整的传递。
有没有办法在 R 中利用排序和二分搜索?或者有没有办法从 y 构建哈希集以加快查找时间?
在 R 中,有没有办法判断矩阵是否稀疏?稀疏矩阵类有很多,比如dgCMatrix,没有is.sparseMatrix方法。
Hadley的新pryr包显示变量的地址非常适合分析.我发现无论何时将变量传递给函数,无论该函数做什么,都会创建该变量的副本.此外,如果函数体将变量传递给另一个函数,则会生成另一个副本.这是一个明显的例子
n = 100000
p = 100
bar = function(X) {
print(pryr::address(X))
}
foo = function(X) {
print(pryr::address(X))
bar(X)
}
X = matrix(rnorm(n*p), n, p)
print(pryr::address(X))
foo(X)
Run Code Online (Sandbox Code Playgroud)
哪个生成
> X = matrix(rnorm(n*p), n, p)
> print(pryr::address(X))
[1] "0x7f5f6ce0f010"
> foo(X)
[1] "0x92f6d70"
[1] "0x92f3650"
Run Code Online (Sandbox Code Playgroud)
尽管功能没有做任何事情,地址每次都会改变.我对这种行为感到困惑,因为我听说R描述为写入时的副本 - 因此可以传递变量,但只有当函数想要写入该变量时才会生成副本.这些函数调用发生了什么?
为了获得最佳的R开发,最好不要编写多个小函数,而是将内容保存在一个函数中?我也发现了一些关于Reference Classes的讨论,但我看到很少有R开发人员使用它.是否有另一种有效的方法来传递我错过的变量?
我想制作一个包含许多ggplots页面的pdf.使用gridExtra,我还可以构建一个带有m x n布局的图表页面(图表m行,图表n列).
该功能ggsave让我写地块的页面,即使是带有内置那些gridExtra具有m x n布局.
只要每个页面具有相同的布局,使用arrangeGrob它甚至可以将ggsave许多页面转换为单个pdf m x n.
我想知道如何ggsave列出具有不同页面布局的图表?例如,我有一个列表,l长度为3表示3页.
l[[1]]是一个2 x 2布局的页面,有4个图
l[[2]]是2 x 1有2个地块
l[[3]] 只是 1 x 1
我怎么能破解ggsave以便我可以将列表l写入1个pdf文件,其中3个页面具有不同的布局?这些图应以横向显示,因此通常命令将具有该表单
ggsave("multipage.pdf", do.call(arrangeGrob, myplots[[i]]), width=11, height=8.5)
Run Code Online (Sandbox Code Playgroud) 我有一个18位的int,R不理解,它返回的值与我输入的值不同
options(digits = 22)
> as.numeric(123456789123456789)
[1] 123456789123456784
Run Code Online (Sandbox Code Playgroud)
当使用具有integer64类的bit64时也是如此
> as.integer64(123456789123456789)
integer64
[1] 123456789123456784
Run Code Online (Sandbox Code Playgroud)
是否有其他包可以正确解释这个数字?
根据Armadillo网站,您可以将lambda函数传入.each_col,例如
X.each_col( [](vec& a){ a.print(); } );
以下Rcpp似乎有错误,报告“预期表达式”
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
arma::vec colCumSum(const arma::mat& X) {
return X.each_col( [](const arma::vec& b){ b.cumsum(); } );
}
Run Code Online (Sandbox Code Playgroud) 我正在Rcpp(Eigen)中开发一种算法,该算法要求矩阵使用cbind。我发现R的绑定速度非常快,而使用Eigen的速度非常慢。我想找到一种优化此功能的方法,以便将算法保留在Rcpp中。到目前为止,我已经找到了另一个链接,但是它适用于密集矩阵上的cbind
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
using namespace Rcpp;
using namespace Eigen;
// [[Rcpp::export]]
Eigen::SparseMatrix<double> RcppMatrixCbind(Eigen::MappedSparseMatrix<double>& matrix1,
Eigen::MappedSparseMatrix<double>& matrix2) {
SparseMatrix<double> out(matrix1.rows(), matrix1.cols() + matrix2.cols());
std::vector<Triplet<double> > tripletList;
tripletList.reserve(matrix1.nonZeros() + matrix2.nonZeros());
for (int k = 0; k < matrix1.outerSize(); ++k)
{
for (MappedSparseMatrix<double>::InnerIterator it(matrix1, k); it; ++it)
{
tripletList.push_back(Triplet<double>(it.row(), it.col(), it.value()));
}
}
for (int k = 0; k < matrix2.outerSize(); ++k)
{
for (MappedSparseMatrix<double>::InnerIterator it(matrix2, k); it; ++it)
{
tripletList.push_back(Triplet<double>(it.row(), it.col() + matrix1.cols(), it.value()));
}
}
out.setFromTriplets(tripletList.begin(), tripletList.end()); …Run Code Online (Sandbox Code Playgroud) 我正在 RcppEigen 中编写一个用于加权协方差的函数。在其中一个步骤中,我想获取矩阵 X 的第 i 列和第 j 列,并计算应该返回某种向量的 cwiseProduct。cwiseProduct 的输出将进入一个可以多次重复使用的中间变量。从文档看来,cwiseProduct返回一个CwiseBinaryOp,它本身有两种类型。我的 cwiseProduct 对两个列向量进行操作,所以我认为正确的返回类型应该是Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr>,但是我收到错误no member named ColXpr in namespace Eigen
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
Rcpp::List Crossprod_sparse(Eigen::MappedSparseMatrix<double> X, Eigen::Map<Eigen::MatrixXd> W) {
int K = W.cols();
int p = X.cols();
Rcpp::List crossprods(W.cols());
for (int i = 0; i < p; i++) {
for (int j = i; j < p; j++) {
Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr> prod = X.col(i).cwiseProduct(X.col(j));
for (int k = 0; k < K; …Run Code Online (Sandbox Code Playgroud)