小编use*_*410的帖子

使用.call()将数据帧从-R传递到R和C.

是否有通用方法将具有任意列(整数/因子,数字,字符数据)的数据帧从r传递到c并返回?非常感谢能够关闭足够示例的指针.

谢谢.

RT

c r

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

R .call()接口和EXTPTRSXP:了解外部分配的对象的PROTECT/UNPROTECT

在下面的代码中,类型为foo的对象是通过调用foo_new()创建的,而对象的外部指针则返回给R.后续计算通过传递ptr_foo来执行.最终通过显式调用foo_free(foo*X)释放该对象.所有计算都由libfoo执行.

创建ptr_foo的事实是否意味着foo对象中的所有其他动态分配的字段都会自动受到保护?或者,垃圾收集器可能会扫除诸如"bar"之类的字段吗?

SEXP foo_new (SEXP n) {
    SEXP ptr_foo;
    foo *X = (foo*) foo_new( 1, sizeof(foo) );
    //foo is protected from garbage collection
    assert( X );
    X->bar = (int*) foo_add_bar(INTEGER_VALUE(n));
    //Is bar protected from garbage collection?
    assert(X->bar);
    PROTECT( ptr_foo = R_MakeExternalPtr(X, install("extptr_foo"), R_NilValue) );
    R_RegisterCFinalizerEx( ptr_foo, ptr_foo_finalize, 1 );
    UNPROTECT( 1 );
    return (ptr_foo);
} 
Run Code Online (Sandbox Code Playgroud)

谢谢,

RT

c memory-management r externalinterface

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

在dplyr中使用'window'函数

我需要按顺序处理数据帧的行,但需要回顾某些行.这是一个近似的例子:

library(dplyr)
d <- data_frame(trial = rep(c("A","a","b","B","x","y"),2))
d <- d %>%
  mutate(cond = rep('', n()), num = as.integer(rep(0,n())))

for (i in 1:nrow(d)){
  if(d$trial[i] == "A"){
  d$num[i] <- 0
  d$cond[i] <- "A"
  }
else if(d$trial[i] == "B"){
  d$num[i] <- 0
  d$cond[i] <- "B"
  }
else{
  d$num[i] <- d$num[i-1] +1
  d$cond[i] <- d$cond[i-1]
  }
}
Run Code Online (Sandbox Code Playgroud)

结果数据框看起来像

> d
Source: local data frame [12 x 3]

    trial cond num
 1      A    A   0
 2      a    A   1
 3      b    A   2
 4      B …
Run Code Online (Sandbox Code Playgroud)

r dplyr

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

使用rm()从父环境中删除对象

我试图从父环境中删除一个对象.

rm_obj <- function(obj){
  a <-deparse(substitute(obj))
  print (a)
  print(ls(envir=sys.frame(-1)))  
  rm(a,envir=sys.frame(-1))
}
> x<-c(1,2,3)
> rm_obj(x)
[1] "x"

[1] "rm_obj" "x"    
Warning message:
In rm(a, envir = sys.frame(-1)) : object 'a' not found
Run Code Online (Sandbox Code Playgroud)

这将有助于澄清我对框架的误解.

r

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

cblas_dgemm - 更正参数:错误消息不正确

我正在尝试计算:C = 1*(A*B') + 0*C使用cblas_dgemm().据我所知,参数是正确的.错误消息本身没有意义:

"ldb must be >= MAX(K,1): ldb=3 K=3Parameter 11 to routine cblas_dgemm was incorrect" 
Run Code Online (Sandbox Code Playgroud)

但是,ldb = k = 3!这是所有三个矩阵和参数的详细输出.

 A:  (m x n: 4x3), lda = 4
 B': (n x k: 3x9), lda = 3
 C:  (m x k, 4x9), ldc = 4


A: 
Dense matrix: 0xfe5cf0, nrows = 4, ncols = 3, ColumnMajor = 1
0.1246  0.5407  0.1822 
0.1020  0.4639  0.3164 
0.3058  0.9872  0.3348 
0.8375  0.9343  0.5893 

B: 
Dense matrix: 0xfe5cd0, nrows = …
Run Code Online (Sandbox Code Playgroud)

c blas

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

悬空指针和双重免费

经历了一些痛苦的经历后,我理解了悬挂指针和双重自由的问题.我正在寻求适当的解决方案

aStruct 有许多字段,包括其他数组.

aStruct *A = NULL, *B = NULL;
A = (aStruct*) calloc(1, sizeof(sStruct));
B = A;
free_aStruct(A);
...
// Bunch of other code in various places.
...
free_aStruct(B);
Run Code Online (Sandbox Code Playgroud)

有没有办法写出free_aStruct(X)这样才能free_aStruct(B)优雅地退出?

void free_aStruct(aStruct *X) {
    if (X ! = NULL) {
        if (X->a != NULL) { free(X->a); x->a = NULL; }
        free(X); X = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

上述操作仅A = NULLfree_aStruct(A);调用时设置.B现在正在晃来晃去.

如何避免/纠正这种情况?引用计数是唯一可行的解​​决方案吗?或者,是否有其他"防御性"方法来释放记忆,防止free_aStruct(B);爆炸?

c pointers double-free dangling-pointer

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

#defined比特标志和枚举 - "c"中的和平共存

我刚刚发现了bitflags的乐趣.我有几个关于在C语言中使用bitflags的"最佳实践"的问题.我从网上找到的各种例子中学到了一些东西,但仍然有问题.

为了节省空间,我在struct(A->flag)中使用单个32位整数字段来表示几组不同的布尔属性.总共有20个不同的位#define.其中一些是真正的存在/不存在标志(STORAGE-INTERNAL与STORAGE-EXTERNAL).其他人有两个以上的值(例如互斥的格式集:FORMAT-A,FORMAT-B,FORMAT-C).我已经定义了用于设置特定位的宏(同时关闭互斥位).如果在标志中设置了特定的位组合,我还定义了用于测试的宏.

但是,上述方法中丢失的是标记的特定分组,最好由枚举捕获.对于编写函数,我想使用枚举(例如,STORAGE-TYPE和FORMAT-TYPE),以便函数定义看起来不错.我希望仅使用枚举来传递参数,使用#defined宏来设置和测试标志.

  1. (a)如何A->flag以便携方式(跨32位/ 64位平台)将flag()定义为32位整数?

  2. (b)我是否应该担心如何存储A->flag#defined常量与枚举相比的潜在大小差异?

  3. (c)我是否使事情变得不必要地复杂化,这意味着我应该坚持使用#defined常量来传递参数作为普通的ints?在这一切中我还应该担心什么?

我为这个表达不清的问题道歉.它反映了我对潜在问题的无知.

c macros enums bitflags

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