有时,我最后这样说:
> x
[1] 1 2 3
> get("x")
Error in get("x") : object x not found
> x
[1] 1 2 3
我可以可靠地复制。 我在《刑法》中做了哪些事情? 为什么在迅速发现<代码>x时打字,但get(x)
不是? <代码>x和get(`x')
内部有何区别?
任何方面都非常赞赏。 我从R 2.14.0开始看到这一点,但我的《刑法》也在发生变化。
EDIT:可推广的实例
// 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
",
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
", 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
", 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
>
任何想法? 如果对<代码>(FALSE)A线作出评论,则该编码行将予以罚款。 对于反复试验,R必须每次重新开始。