小编b_r*_*on_的帖子

如何从R会话中更改C宏变量(预处理器定义指令)?

问题

  1. 从R会话内部编译共享库system()或使用shell()它们动态加载它们是不好的做法吗?
  2. 是否有一种"更好"的方式(比下面的代码)根据来自R会话的用户输入更改C源文件中的宏变量的值?

背景

目的

在R会话中,我想创建一个函数

  1. 更改模板C源文件中的宏变量的值,
  2. 为编辑后的源文件指定一个新名称,
  3. 编译新程序的共享库,和
  4. 动态地将新共享库加载到当前R会话中

调用模板C源文件template.tmp,让它看起来像:

...
#define VAR
...
Run Code Online (Sandbox Code Playgroud)

(我不打算实际编译template.tmp,因此.tmp文件扩展名.我只是用它作为模板创建其他源文件,只有#define指令发生变化.)

下面是我创建的R函数,用于执行上述步骤.为简单起见,我删除了代码行,这些代码声明了正确的路径名,或者为Windows和其他类似的Unix添加了可移植性.

myfunc <- function(val){
  # create commands for system()
  subst_cmd <- paste0("sed 's/define VAR/define VAR ", val, "/' template.tmp > newprog.c")
  shlib_cmd <- paste0("R CMD SHLIB newprog.c")

  # submit commands to system()
  system(subst_cmd)
  system(shlib_cmd)

  # dynamically load shared library
  dyn.load(newprog.so)
}
Run Code Online (Sandbox Code Playgroud)

因此,myfunc(12345)将使用以下行创建新的C源文件,并将其编译为共享库并将其动态加载到当前R会话中.

...
#define VAR 12345
...
Run Code Online (Sandbox Code Playgroud)

动机

我有一个功能,其中速度非常重要,因为该功能可以被调用数千次.与使用#define …

c r directive system

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

如何在列表中的每个连续零运行中删除除x之外的所有零?

对于xPython中列表中的每个连续或更多的零运行,我想在运行中除了x它们之外全部为零.如果x = 0,则删除全部为零.

我在考虑一个Python函数,它将列表L和数字x作为输入.

例如,让我们L = [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 0, 8].

  • 如果x = 0,那么回来L = [7, 12, 2, 27, 10, 8]
  • 如果x = 1,那么回来L = [7, 0, 12, 0, 2, 0, 27, 10, 0, 8]
  • 如果x = 2,那么回来L = [7, 0, 12, 0, 0, 2, 0, 0, 27, …

python list del

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

在C++中,如何在列表中的每个连续零运行中删除除x之外的所有零?

对于xC++列表中每次运行或连续的零,我想删除运行中的所有零,除了x它们.如果x = 0,则删除全部为零.

我在考虑一个C++函数,它将一个列表list<int> L和一个数字int x作为输入.

例如,让我们L = {7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 0, 8}.

  • 如果x = 0,那么回来L = {7, 12, 2, 27, 10, 8}
  • 如果x = 1,那么回来L = {7, 0, 12, 0, 2, 0, 27, 10, 0, 8}
  • 如果x = 2,那么回来L = {7, 0, 12, 0, 0, 2, 0, …

c++ algorithm list erase-remove-idiom c++11

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

标签 统计

list ×2

algorithm ×1

c ×1

c++ ×1

c++11 ×1

del ×1

directive ×1

erase-remove-idiom ×1

python ×1

r ×1

system ×1