小编col*_*ang的帖子

为什么C#编译器没有优化掉重复的局部变量默认值初始化?

背景

我知道编译器会"省略int foo = 0;为字段生成代码因为内存分配器会将字段初始化为默认值." 参考

        class Foo
        {
            public int a = 1;
            public int b = 0;
        }
        Foo..ctor:
        IL_0000:  ldarg.0     
        IL_0001:  ldc.i4.1
        IL_0002:  stfld       UserQuery+Foo.a // There is no b.
        IL_0007:  ldarg.0
        IL_0008:  call        System.Object..ctor
        IL_000D:  ret
Run Code Online (Sandbox Code Playgroud)

我也知道"编译器会自动添加.locals init每个使用局部变量的方法,表明JIT必须在开始执行方法之前注入初始化所有局部变量的代码." 参考

为什么编译器没有int foo = 0;为局部变量之类的东西省略生成IL,因为.locals init已经覆盖了它?(为了与字段保持一致?)

(我理解C#规范要求明确分配局部变量,我很好.)

(我引用的链接说明了为什么.locals init需要,以及为什么C#规范要求初始化本地化.但是它没有说明为什么必须存在额外的IL指令来初始化默认值.因为验证过程已经确定了.locals init)

void Main()
{
    int a = 0;
    int b = 1;
    int c = 0; …
Run Code Online (Sandbox Code Playgroud)

c# clr il

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

为什么我不能修改取消装箱转换的结果?

struct Point
{
    public int x;
    public int y;
}
void Main()
{
    Point p;
    p.x = 1;
    p.y = 1;
    Object o = p;
    ((Point) o).x = 4; // error
    ((Point) o).x = 5; // error
    ((Point) o).x = 6; // error
    p = (Point) o  // expect 6
}
Run Code Online (Sandbox Code Playgroud)

为什么不编译

ldloc.1 // o
unbox Point
ldc.i4.4
stfld Point.x
Run Code Online (Sandbox Code Playgroud)

C++ CLI允许的地方.

对于那些不知道是谁,unbox不是需要创建的副本值类型,而是推的指针值到堆栈.只有分配才能创建副本.

c# il boxing unboxing

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

如何使用自定义列名聚合(使用"by")data.table而不使用":="?

我知道我能做到这一点

  a <- dt[,sum(x), by=y]
Run Code Online (Sandbox Code Playgroud)

我也可以这样做

  dt[,z:=sum(x), by=y] # this would modify dt
Run Code Online (Sandbox Code Playgroud)

但是我不知道为什么我不能这样做:

  a <- dt[,z=sum(x), by=y]
Run Code Online (Sandbox Code Playgroud)

如何使用自定义列名称执行"汇总"?

这是唯一的选择吗?

  a <- copy(dt)
  a[,z:=sum(x), by=y]
Run Code Online (Sandbox Code Playgroud)

r data.table

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

如何使用`[[`和`$`作为函数?

我知道我可以这样做:

x <- list(a=1, b=1)
y <- list(a=1)
JSON <- rep(list(x,y),10000)
sapply(JSON, "[[", "a")
Run Code Online (Sandbox Code Playgroud)

但是,我以$同样的方式努力使用

sapply(JSON, "$", "a")
sapply(JSON, "$", a)
Run Code Online (Sandbox Code Playgroud)

另外,是否可以将运算符用作其他语言的函数?

例如a + b 相当于(+)(a, b)

r

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

使用scale_fill_gradient时处理极值/分布的其他方法?

例如,我想将颜色z映射到0,将地图映射到"白色".

> a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12))
> a
    x y           z
1   1 1  -0.4603911
2   2 1  -0.4868471
3   3 1   0.2180346
4   4 1  -0.8807652
5   5 1   1.7379462
6   6 1  -0.1334904
7   7 1  -0.3675578
8   8 1   0.9225425
9   9 1 -12.0000000
10 10 1  12.0000000

ggplot(a,aes(x=x,y=y,fill=z)) + geom_bar(stat="identity") + 
  scale_fill_gradient2(high="green", mid="white", low="red")
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,颜色并不是真正有用的指标,而不是传达关于值如何分布的一般概念,现在颜色只能告诉哪些值是极端的,留下大多数值无法区分未经训练的眼睛.

有一种方法在geom_raster中的值范围内进行非线性颜色分布,但它看起来有点复杂,我只能模糊地理解它是如何工作的.

在此输入图像描述

然后我想也许order是一个很好的重新缩放方式,因此:

ggplot(a,aes(x=x,y=y,fill=ecdf(z)(z))) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red", midpoint=ecdf(a$z)(0))
Run Code Online (Sandbox Code Playgroud)

它在某种程度上起作用(这里我使用ecdf而不是order …

r ggplot2

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

有没有一种简单的方法来实现类似于`x [,c:= mean(a),by = b] $ c`的东西?

> x <- data.table(a=1:10, b=rep(1:2, 5))
> x
     a b
 1:  1 1
 2:  2 2
 3:  3 1
 4:  4 2
 5:  5 1
 6:  6 2
 7:  7 1
 8:  8 2
 9:  9 1
10: 10 2
> x[,c:=mean(a), by=b]
> y <- x$c
> y
 [1] 5 6 5 6 5 6 5 6 5 6
Run Code Online (Sandbox Code Playgroud)

最终,我感兴趣的y是一个向量,我不想添加cdata.table.有没有更简单的方法y从原来的x

当我试图在直方图中对不同的组应用不同的权重时出现问题.

# here weight would be the same for …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 data.table

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

为什么`cumsum`在ggplot中的组或构面中不起作用?

ggplot2中绘制累计计数中借用示例

x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200))
ggplot(x,aes(x=X,color=A)) + stat_bin(aes(y=cumsum(..count..)),geom="step")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如您所见,cumsum跨小组和多方面工作。我想知道为什么会这样吗?显然..count..是在组内完成的,为什么cumsum不应用于..count..?ggplot是否在内部将所有内容..count..整合到一个向量中然后应用于cumsum它?

如何在不进行预处理的情况下(例如使用)正确解决它plyr

而且我不介意geom不是step,只要图形是累积图就可以line,甚至可以bar

r ggplot2

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

为什么regexp_matches没有匹配的行像过滤器一样工作,并且不返回?

我想了解原因

SELECT *, regexp_matches(A, 'pattern') FROM table
Run Code Online (Sandbox Code Playgroud)

只会返回A有模式的行pattern,即使我没有WHERE子句?

regexp_matches如果没有匹配会返回什么?我原以为是null,但如果是,null那么查询应该只返回null所有那些不匹配的结果?

如何构建自定义函数来执行类似的操作:当参数适合时,相应的行将被过滤,以便我不必追加where

sql postgresql

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

将iterable作为参数的函数是否总是接受迭代器?

我知道的iteratoriterable,但只有一次通过.

例如,许多功能中itertoolsiterable为参数,例如islice.iterator如果我看到api说的话,我可以随时通过iterable吗?

正如@delnan指出:

虽然每个iterator都是一个iterable,但有些人(在核心团队之外)说"可迭代",当他们的意思是"可以用相同的结果迭代几次".野外的一些代码声称可以使用iterables但实际上不起作用 iterators.

这是我的担忧.是否有iterable支持多通道的名称?喜欢IEnumerableC#?

如果我要构建一个声称支持的功能iterable,那么实际支持iterator也是最佳实践吗?

python iterator

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

data.table如何从j获取列名?

例如:

dt <- data.table()
x=1:5
> dt[,list(2,3,x)]
   V1 V2 x
1:  2  3 1
2:  2  3 2
3:  2  3 3
4:  2  3 4
5:  2  3 5
Run Code Online (Sandbox Code Playgroud)

结果data.table有列 x

出于某种原因,我想创建一个简化data.table构造的函数.

tt <- function(a, b, ...){
    list(a=sum(a), b=sum(b), ...)
}

> dt[,tt(1:2,1:3,x)]
   a b V3
1: 3 6  1
2: 3 6  2
3: 3 6  3
4: 3 6  4
5: 3 6  5
Run Code Online (Sandbox Code Playgroud)

因此,每当我打电话时list,我都会使用tt它,因此它会自动为我插入预定义的列.但是,现在它无法识别快捷方式命名x.

如果不太难,如何在data.table中改进tt自动命名列list

目标 …

r data.table

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

标签 统计

r ×6

data.table ×3

ggplot2 ×3

c# ×2

il ×2

boxing ×1

clr ×1

iterator ×1

postgresql ×1

python ×1

sql ×1

unboxing ×1