是否有通用方法将具有任意列(整数/因子,数字,字符数据)的数据帧从r传递到c并返回?非常感谢能够关闭足够示例的指针.
谢谢.
RT
在下面的代码中,类型为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
我需要按顺序处理数据帧的行,但需要回顾某些行.这是一个近似的例子:
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) 我试图从父环境中删除一个对象.
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)
这将有助于澄清我对框架的误解.
我正在尝试计算: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) 经历了一些痛苦的经历后,我理解了悬挂指针和双重自由的问题.我正在寻求适当的解决方案
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 = NULL在free_aStruct(A);调用时设置.B现在正在晃来晃去.
如何避免/纠正这种情况?引用计数是唯一可行的解决方案吗?或者,是否有其他"防御性"方法来释放记忆,防止free_aStruct(B);爆炸?
我刚刚发现了bitflags的乐趣.我有几个关于在C语言中使用bitflags的"最佳实践"的问题.我从网上找到的各种例子中学到了一些东西,但仍然有问题.
为了节省空间,我在struct(A->flag)中使用单个32位整数字段来表示几组不同的布尔属性.总共有20个不同的位#define.其中一些是真正的存在/不存在标志(STORAGE-INTERNAL与STORAGE-EXTERNAL).其他人有两个以上的值(例如互斥的格式集:FORMAT-A,FORMAT-B,FORMAT-C).我已经定义了用于设置特定位的宏(同时关闭互斥位).如果在标志中设置了特定的位组合,我还定义了用于测试的宏.
但是,上述方法中丢失的是标记的特定分组,最好由枚举捕获.对于编写函数,我想使用枚举(例如,STORAGE-TYPE和FORMAT-TYPE),以便函数定义看起来不错.我希望仅使用枚举来传递参数,使用#defined宏来设置和测试标志.
(a)如何A->flag以便携方式(跨32位/ 64位平台)将flag()定义为32位整数?
(b)我是否应该担心如何存储A->flag与#defined常量与枚举相比的潜在大小差异?
(c)我是否使事情变得不必要地复杂化,这意味着我应该坚持使用#defined常量来传递参数作为普通的ints?在这一切中我还应该担心什么?
我为这个表达不清的问题道歉.它反映了我对潜在问题的无知.