小编Kon*_*lph的帖子

在循环中执行array.length或list.count是否代价高昂

我知道在JavaScript中,像这样创建一个for循环:for(int i = 0; i < arr.length; i++)因为它每次都计算数组长度,所以代价很高.对于列表和数组,这种行为在c#中是否代价高昂.或者在编译时它是否经过优化?还有其他语言如Java,这是如何处理的?

c# compiler-construction performance language-features

20
推荐指数
2
解决办法
5596
查看次数

没有包的命名空间

在重新组织我的代码库时,我想清理我的代码共享机制.到目前为止,我正在使用source许多小型的,基本上是独立的功能模块.

然而,这种方法存在许多问题,其中包括

  • 缺乏圆形度测试(意外圆形source链),
  • 正确指定包含路径(chdir=TRUE参数,硬编码路径)所需的复杂语法,
  • 名称冲突的可能性(重新定义对象时).

理想情况下,我希望得到类似于Python模块机制的东西.将R封装机制将是矫枉过正这里:  希望产生嵌套路径层级,以吨元数据的多个文件和手动构建包只是为了获得一个小的,独立的,可重用的代码模块.

现在我正在使用一个代码片段,它允许我解决上面提到的前两个问题.包含的语法是这样的:

import(functional)
import(io)
import(strings)
Run Code Online (Sandbox Code Playgroud)

...并且模块被定义为驻留在本地路径中的简单源文件.的定义import很简单,但我解决不了的第三点:我想将模块导入到不同的命名空间但是从我看到的命名空间查找机制是相当硬连接到封装.的确,我可以覆盖`::`或者getExportedValue,也许asNamespaceisNamespace,但那种感觉很肮脏,有断裂其它程序包的潜力.

namespaces module r

20
推荐指数
6
解决办法
1759
查看次数

我如何仅总结一部分表格?

我有两个相关的用例,我需要总结一个表的部分,以类似的方式指定filter.

简而言之,我想要这样的东西:

iris %>%
    use_only(Species == 'setosa') %>%
    summarise_each(funs(sum), -Species) %>%
    mutate(Species = 'setosa_sum') %>%
    use_all()
Run Code Online (Sandbox Code Playgroud)

产生这个:

Source: local data frame [101 x 5]

   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1         250.3       171.4         73.1        12.3 setosa_sum
2           7.0         3.2          4.7         1.4 versicolor
3           6.4         3.2          4.5         1.5 versicolor
4           6.9         3.1          4.9         1.5 versicolor
5           5.5         2.3          4.0         1.3 versicolor
…
Run Code Online (Sandbox Code Playgroud)

因此,我不使用列的值进行分组,而是使用过滤条件对表的视图进行操作,而不会实际丢失表的其余部分(与过滤器不同).

我如何巧妙地实施use_only/ use_all更好的是,这个功能已经包含在内,dplyr我该如何使用它?

生成上面的结果当然很容易,但我需要为许多不同的情况做类似的事情,具有复杂和可变的过滤标准.

r dplyr

20
推荐指数
3
解决办法
350
查看次数

令人困惑的声明和初始化程序

这个声明很混乱:

char* q {new char[1024]{}}; // q[i] becomes 0 for all
Run Code Online (Sandbox Code Playgroud)

这是"指向char数组的char指针" 还是" 指针数组"?

我认为这new char[1024]{}是初始化一个char1024个元素的数组,每个元素的值为0.

所以这和:

char* q = [0,0,....] // until 1024
Run Code Online (Sandbox Code Playgroud)

正确?

c++ pointers initializer-list

20
推荐指数
2
解决办法
1570
查看次数

从R写入UTF-8文件

虽然R似乎在内部很好地处理Unicode字符,但是我无法在R中输出具有这种UTF-8 Unicode字符的数据帧.有没有办法强迫这个?

data.frame(c("h?ersumian","?mettigan"))->test
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
Run Code Online (Sandbox Code Playgroud)

输出文本文件如下:

hiersumian <U+01E3>mettigan

我在Windows环境(Windows 7)中使用R 3.0.2版.

编辑


在答案中已经建议R正确地以UTF-8编写文件,问题在于我用来查看文件的软件.这里有一些代码,我在R中做所有事情.我正在用UTF-8编码的文本文件中读取,并且R正确读取它.然后R将文件写入UTF-8并再次读回,现在正确的Unicode字符消失了.

read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
myinputfile[1,1]
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
myoutputfile[1,1]
Run Code Online (Sandbox Code Playgroud)

控制台输出:

> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
> myinputfile[1,1]
[1] h?ersumian
Levels: h?ersumian ?mettigan
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
> myoutputfile[1,1]
[1] <U+FEFF>hiersumian
Levels: <U+01E3>mettigan <U+FEFF>hiersumian
> 
Run Code Online (Sandbox Code Playgroud)

windows unicode r utf-8

19
推荐指数
1
解决办法
2万
查看次数

修复轴标签中的排版

序言:我想从R创建出版级图形而不进行后处理.我所在研究所的其他研究人员总是在图形软件(如Adobe Illustrator)中进行后处理.我希望避免这种情况.

我的抱怨是R不对负数使用正确的减号(特别是在绘图轴上):

plot(-20:-1, rnorm(20) + 1 : 20)
Run Code Online (Sandbox Code Playgroud)

负数的情节

(我已经把犯罪者围了起来供你考虑.)

作为一个排版书呆子(这是真的!检查我的职业生涯简历!)这是不可接受的.我需要在这里使用正确的Unicode字符ᴍɪɴᴜꜱꜱɪɢɴ(U + 2212," - ").我的一个朋友在发布之前通过替换Adobe Illustrator中的所有减号来实现这一点,但我不禁认为必须有一种更好的方法 - 从R内部 - 来实现这一目标; 并且不会强迫我手动更换所有轴标签.

(我目前没有使用ggplot2,但如果有一个只适用于ggplot2的解决方案,我很乐意接受它.)

plot typography r

18
推荐指数
4
解决办法
1055
查看次数

嵌套列表(字符串向量的向量)初始化失败

这段代码:

#include <vector>
#include <string>
#include <iostream>

class MyClass
{
public:
  MyClass(const std::vector<std::vector<std::string>> & v)
  {
    std::cout << "Vector of string vectors size: " << v.size() << "\n";

    for (size_t i = 0; i < v.size(); i++)
      std::cout << "Vector #" << i << " has size " << v[i].size() << "\n";
  }
};

int main()
{
  MyClass({ { "a" } }); // <--- ok
  MyClass({ { "a", "b" } }); // <--- PROBLEM
  MyClass({ { std::string("a"), "b" } }); …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 visual-studio-2017

18
推荐指数
2
解决办法
1300
查看次数

CUDA:用C++包装设备内存分配

我现在开始使用CUDA并且不得不承认我对C API有点失望.我理解选择C的原因,但是语言基于C++而不是,有几个方面会更简单,例如设备内存分配(via cudaMalloc).

我的计划是这样做我自己,用重载operator new与安置new和RAII(两种选择).我想知道到目前为止我是否有任何警告.代码似乎工作,但我仍然想知道潜在的内存泄漏.

RAII代码的用法如下:

CudaArray<float> device_data(SIZE);
// Use `device_data` as if it were a raw pointer.
Run Code Online (Sandbox Code Playgroud)

也许一个类在这种情况下是过度的(特别是因为你仍然必须使用cudaMemcpy,该类只封装RAII)所以另一种方法是放置new:

float* device_data = new (cudaDevice) float[SIZE];
// Use `device_data` …
operator delete [](device_data, cudaDevice);
Run Code Online (Sandbox Code Playgroud)

这里,cudaDevice仅作为触发过载的标签.但是,由于在正常放置中new这将指示放置,我发现语法奇怪地一致,甚至可能更喜欢使用类.

我很欣赏各种批评.是否有人知道是否计划为下一版本的CUDA(正如我所听到的那样,将改进其C++支持,无论它们的含义是什么).

所以,我的问题实际上有三个:

  1. 我的展示位置是否new超载语义正确?它会泄漏内存吗?
  2. 有没有人有关于未来CUDA发展的信息,这是朝着这个大方向发展的(让我们面对它:C++ s*ck中的C接口)?
  3. 如何以一致的方式进一步采取这种方式(还有其他需要考虑的API,例如,不仅有设备内存,还有常量内存和纹理内存)?

// Singleton tag for CUDA device memory placement.
struct CudaDevice {
    static CudaDevice const& get() { return instance; }
private:
    static …
Run Code Online (Sandbox Code Playgroud)

c++ cuda raii placement-new

17
推荐指数
2
解决办法
8572
查看次数

"aaaa".StartsWith("aaa")返回false

如果这不是一个错误,那么有人可以解释这种行为背后的原因吗?事实上,似乎每个奇数个字母都会返回false:

string test = "aaaaaaaaaaaaaaaaaaaa";
Console.WriteLine(test.StartsWith("aa"));
Console.WriteLine(test.StartsWith("aaa"));
Console.WriteLine(test.StartsWith("aaaa"));
Console.WriteLine(test.StartsWith("aaaaa"));
Console.WriteLine(test.StartsWith("aaaaaa"));
Console.WriteLine(test.StartsWith("aaaaaaa"));
Run Code Online (Sandbox Code Playgroud)

在丹麦系统上执行时输出后的输出:

True
False
True
False
True
False
Run Code Online (Sandbox Code Playgroud)

c# string startswith

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

用于替换非本地列表中的值的赋值

[[<- 在非本地对象上使用时,列表和环境的行为会有所不同:

lst = list()
env = new.env()

(function () lst[['x']] = 1)()
(function () env[['x']] = 1)()
Run Code Online (Sandbox Code Playgroud)
lst
# list()

as.list(env)
# $x
# [1] 1
Run Code Online (Sandbox Code Playgroud)

换句话说,如果目标[[<-是环境,它会修改(非本地)环境,但如果它是矢量/列表,则会创建一个新的本地对象.

我想知道两件事:

  1. 为什么这种行为上的差异?
  2. 有没有一种方法可以实现列表和环境相同的结果,而不使用<<-

关于(1),我知道列表和环境之间存在多种差异(特别是我知道环境不会被复制)但文档中没有提到为什么[[<-两者之间的语义不同 - 特别是为什么运营商将在不同的范围内运作.这是一个错误吗?至少它是反直觉的,并且需要一些非平凡的实现恶作剧.1

关于(2),显而易见的解决方案当然是使用<<-:

(function () lst[['x']] <<- 1)()
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢严格理解差异,而不是仅仅解决它们.此外,我到目前为止使用assign而不是,<<-我更喜欢这个,因为它允许我更好地控制作业的范围(特别是因为我可以指定inherits = FALSE.<<-对我来说太多伏都教了.

但是,上述内容无法解决(据我所知)使用,assign因为assign只适用于环境,而不是列表.特别是,虽然assign('x', 1, env)工作(并且与上面相同),assign('x', 1, lst)但是不起作用.


1 为了详细说明,当然希望R使用动态调度(例如通过S3)对不同的对象类型做不同的事情.但是,这不是 …

environment r list assign

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