小编kas*_*rma的帖子

表格的Rcpp版本较慢; 这是从哪里来的,如何理解

在为已经聚合的数据创建一些采样函数的过程中,我发现表格在我正在使用的大小数据上相当慢.我尝试了两个改进,首先是Rcpp函数,如下所示

// [[Rcpp::export]]
IntegerVector getcts(NumericVector x, int m) {
  IntegerVector cts(m);
  int t;
  for (int i = 0; i < x.length(); i++) {
    t = x[i] - 1;
    if (0 <= t && t < m)
      cts[t]++;
  }
  return cts;
}
Run Code Online (Sandbox Code Playgroud)

然后在试图理解为什么表格相当慢的时候,我发现它基于制表.Tabulate对我来说效果很好,并且比Rcpp版本更快.制表的代码位于:

https://github.com/wch/r-source/blob/545d365bd0485e5f0913a7d609c2c21d1f43145a/src/main/util.c#L2204

关键是:

for(R_xlen_t i = 0 ; i < n ; i++)
  if (x[i] != NA_INTEGER && x[i] > 0 && x[i] <= nb) y[x[i] - 1]++;
Run Code Online (Sandbox Code Playgroud)

现在制表和我的Rcpp版本的关键部分看起来非常接近(我没有打扰过NA).

Q1:为什么我的Rcpp版本慢了3倍?

Q2:我怎样才能知道这个时间到了哪里?

我非常感谢知道时间的去向,但更好的方法是分析代码.我的C++技能只是如此,但这似乎很简单,我应该(交叉我的手指)能够避免任何会使我的时间增加三倍的愚蠢的东西.

我的时间码:

max_x <- 100
xs <- sample(seq(max_x), …
Run Code Online (Sandbox Code Playgroud)

r rcpp

6
推荐指数
1
解决办法
216
查看次数

Android:启动画面没有显示,为什么?

我正在学习Android.从我到目前为止阅读的文档中我无法弄清楚如何使用show view来显示(在睡眠期间屏幕保持空白).看来我需要为主布局开始一个新的活动,但这看起来很浪费(飞溅应该永远消失,我想重用它的线程).

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Ext3 extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        Log.v("Ext3", "starting to sleep");

        try {
            Thread.sleep (5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Log.v("Ext3", "done sleeping");

        setContentView (R.layout.main);
    }

}
Run Code Online (Sandbox Code Playgroud)

android splash-screen

5
推荐指数
1
解决办法
4226
查看次数

向没有值的项x组对添加默认值(df%&gt;%价差%&gt;%聚集似乎很奇怪)

简洁版本

怎么做

df1 %>% spread(groupid, value, fill = 0) %>% gather(groupid, value, one, two)
Run Code Online (Sandbox Code Playgroud)

以更自然的方式?

长版

给定数据框

df1 <- data.frame(groupid = c("one","one","one","two","two","two", "one"),
                  value = c(3,2,1,2,3,1,22),
                  itemid = c(1:6, 6))
Run Code Online (Sandbox Code Playgroud)

对于许多itemid和groupid对,我们都有一个值,对于某些itemid,有些groupids没有值。我想为这些情况添加默认值。例如对于itemid 1和groupid“ two”没有值,我想在其中获取默认值的行中添加一个值。

以下tidyr代码可实现此目的,但感觉起来很奇怪(在此添加的默认值为0)。

df1 %>% spread(groupid, value, fill = 0) %>% gather(groupid, value, one, two)
Run Code Online (Sandbox Code Playgroud)

我正在寻找有关如何以更自然的方式执行此操作的建议。

由于在过去的几周里看了上面的代码,我可能对其效果感到困惑,所以我编写了一个包装它的函数:

#' Add default values for missing groups
#' 
#' Given data about items where each item is identified by an id, and every
#' item can have a value in every group; …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyr

5
推荐指数
1
解决办法
171
查看次数

Docker用户进出容器:什么是对应关系(UID/GID),看到我不理解的效果

我正在努力了解docker的功能,以便我有理由相信我正在安全地使用它.对此的一个建议是始终USER在Dockerfile中使用语句.在试图了解这种效果时我遇到了一些麻烦.

具体问题:

  1. 什么机制允许主机内核处理仅存在于容器中的用户?
  2. 为什么下面的run2显示目录所属,testuser但不允许ls目录中的when?
  3. 为什么下面的run3显示该目录属于testuser

此问题底部的版本信息.

建立

我有以下Dockerfile

FROM alpine@sha256:1354db23ff5478120c980eca1611a51c9f2b88b61f24283ee8200bf9a54f2e5c

LABEL version 2.0
LABEL description "Test image for setting user"

RUN adduser -D testuser1   ## sometimes removed
RUN adduser -D testuser2   ## sometimes removed
RUN adduser -D testuser

USER testuser

CMD sh
Run Code Online (Sandbox Code Playgroud)

我建立这个

docker build -t kasterma/testuser:1 .
Run Code Online (Sandbox Code Playgroud)

然后运行

docker run -ti -v /home/kasterma/test-user/:/test-home kasterma/testuser:1
Run Code Online (Sandbox Code Playgroud)

该目录/home/kasterma/test-user/是包含Dockerfile的目录.

运行1:删除##sometimes removedDockerfile中标记的两行.

[root@datalocal01 test-user]# docker run -ti -v /home/kasterma/test-user/:/test-home kasterma/testuser:1
/ $ …
Run Code Online (Sandbox Code Playgroud)

docker

5
推荐指数
1
解决办法
346
查看次数

在igraph中获取边缘的目标或来源

给定图fg,我的例子:

library("igraph")

fg <- feature.graph <- graph.empty()

fg <- fg + vertices("root", "ho", "ha", value=c(1,2,3)) +
  edges(c("root", "ho", "root", "ha"), label=c("en", "an"), prob=c(0.2,0.8))
Run Code Online (Sandbox Code Playgroud)

我提取了一个感兴趣的边缘:

> edge.of.interest <- E(fg)[from("root")][[1]]
> edge.of.interest
Edge sequence:
    e             
e [1] root -> ho  
Run Code Online (Sandbox Code Playgroud)

要获得此边缘的源或目标,我可以这样做:

> get.edge(fg, edge.of.interest)
[1] 1 2
> get.edge(fg, edge.of.interest)[1]
[1] 1
> get.edge(fg, edge.of.interest)[2]
[1] 2
Run Code Online (Sandbox Code Playgroud)

我原本期望一个具有这种效果的函数源和目标:

> target(edge.of.interest)
2
Run Code Online (Sandbox Code Playgroud)

我一直无法找到这个或等效的功能.通过get.edge的方法是最好的吗?

r igraph

4
推荐指数
1
解决办法
1530
查看次数

Docker 似乎忽略了从 `eval $(docker-machine env)` 设置的 DOCKER_HOST 和其他变量

我在 OS X 上,通过 brew 安装了 docker。尝试使用 docker-machine 和 docker 的组合。Docker 似乎忽略了我的环境设置。我怎样才能解决这个问题?

   $ docker-machine env default2
   export DOCKER_TLS_VERIFY="1"
   export DOCKER_HOST="tcp://192.168.99.100:2376"
   export DOCKER_CERT_PATH="/Users/kasterma/.docker/machine/machines/default2"
   export DOCKER_MACHINE_NAME="default2"
   # Run this command to configure your shell:
   # eval $(docker-machine env default2)

   $ eval $(docker-machine env default2)
Run Code Online (Sandbox Code Playgroud)

我的理解是现在一切都在 shell 中设置,因为它应该使用 docker。然而:

   $ docker ps
   Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Run Code Online (Sandbox Code Playgroud)

如果我在命令行上指定所有内容,它就可以工作

   $ docker -H tcp://192.168.99.100:2376 --tls --tlscacert /Users/kasterma/.docker/machine/machines/default2/ca.pem --tlscert /Users/kasterma/.docker/machine/machines/default2/cert.pem --tlskey /Users/kasterma/.docker/machine/machines/default2/key.pem ps
   CONTAINER ID        NAMES               IMAGE               STATUS …
Run Code Online (Sandbox Code Playgroud)

docker docker-machine

1
推荐指数
1
解决办法
1207
查看次数

标签 统计

r ×3

docker ×2

android ×1

docker-machine ×1

dplyr ×1

igraph ×1

rcpp ×1

splash-screen ×1

tidyr ×1