【发布时间】:2011-12-26 00:56:29
【问题描述】:
不知何故,有时,我最终会处于这样的状态:
> x
[1] 1 2 3
> get("x")
Error in get("x") : object 'x' not found
> x
[1] 1 2 3
我无法可靠地复制它。我在 C 代码中可能做错了什么?为什么在提示符下输入x 会找到它,而get("x") 却找不到? x 和 get("x") 内部有什么区别?
非常感谢任何提示。我从 R 2.14.0 开始就看到了这一点,但我的 C 代码也发生了变化。
编辑:可重现的示例
// test.c
#include <R.h>
#include <Rdefines.h>
SEXP test(SEXP df)
{
SEXP levels, s;
int j;
levels = getAttrib(VECTOR_ELT(df,0), R_LevelsSymbol);
Rprintf("levels %u, type %d, length %d, truelength %d\n",
levels,TYPEOF(levels),LENGTH(levels),TRUELENGTH(levels));
for (j=0; j<length(levels); j++) {
s = STRING_ELT(levels,j);
Rprintf("%d %d %s %u %d %d\n", length(levels), TYPEOF(s),
CHAR(s), s, LENGTH(s), TRUELENGTH(s));
SET_TRUELENGTH(s,1); // clobbers the 65, but why 65 ("A") there?
Rprintf("%d %d %s %u %d %d\n", length(levels), TYPEOF(s),
CHAR(s), s, LENGTH(s), TRUELENGTH(s));
}
return(R_NilValue);
}
并运行它:
R --vanilla
system("R CMD SHLIB -otest.so test.c")
dyn.load("test.so")
if (FALSE) A # needed for error to occur (!)
DF <- data.frame(a = c("A", "Z"), b = 1:4)
print(DF)
.Call("test",DF)
print(DF)
A = data.frame()
for (i in 1:100) {
cat(i,"")
assign(paste("v",i,sep=""),i)
get("A")
}
我得到的输出:
$ R --vanilla
R version 2.14.0 (2011-10-31)
# [snip header]
> system("R CMD SHLIB -otest.so test.c")
gcc -std=gnu99 -I/usr/share/R/include -fpic -std=c99 -O6 -Wall -Wno-unused -pedantic -c test.c -o test.o
gcc -std=gnu99 -shared -o test.so test.o -otest.so -L/usr/lib/R/lib -lR
> dyn.load("test.so")
>
> if (FALSE) A # needed for error to occur (!)
>
> DF <- data.frame(a = c("A", "Z"), b = 1:4)
> print(DF)
a b
1 A 1
2 Z 2
3 A 3
4 Z 4
> .Call("test",DF)
levels 151395176, type 16, length 2, truelength 0
2 9 A 149596512 1 65 # why this 65 here?
2 9 A 149596512 1 1
2 9 Z 149596320 1 0
2 9 Z 149596320 1 1
NULL
> print(DF)
a b
1 A 1
2 Z 2
3 A 3
4 Z 4
>
> A = data.frame()
> for (i in 1:100) {
+ cat(i,"")
+ assign(paste("v",i,sep=""),i)
+ get("A")
+ }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Error in get("A") : object 'A' not found
>
> sessionInfo()
R version 2.14.0 (2011-10-31)
Platform: i686-pc-linux-gnu (32-bit)
locale:
[1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_GB.UTF-8 LC_COLLATE=en_GB.UTF-8
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
>
有什么想法吗?如果 if (FALSE) A 行被注释掉,那么它工作正常。对于重复测试,R 必须每次都从新开始。
【问题讨论】:
-
您能否详细说明
my C code has also been changing too。我不熟悉 C,但您绝对应该发布 C 代码,并等待@Dirk Eddelbuettel 出现。顺便说一句,我无法复制这种行为。 -
但公开您的代码更为重要。 =)
-
@aL3xa 在这种情况下不是。我是
data.table包的合著者 - 我需要向您展示如何加载它并在开发模式(开发版本)下运行它,然后以特定方式运行它,即使这样对我来说是不可复制的。在问题中,我已经说过我无法复制。这是一个关于在提示符下键入x和使用get之间区别的一般问题。好吗? -
可能是环境问题?
find("x")给了什么? -
@James。你好。
find()找到它,objects()列出它,所以它似乎在.GlobalEnv中,但get()不这么认为。
标签: r