R 我们可以';如果从函数运行,是否看不到向量?

R 我们可以';如果从函数运行,是否看不到向量?,r,sweave,R,Sweave,我有一个函数,它将向量设置为字符串,用新名称复制一个swave文档,然后运行该swave。在swave文档中,我想使用我在函数中设置的向量,但它似乎没有看到它 (编辑:我将此函数更改为使用tempdir((),如Dirk所建议的那样) 我创建了一个swave文件test_swave.rnw % \documentclass[a4paper]{article} \usepackage[OT1]{fontenc} \usepackage{Sweave} \begin{document} \tit

我有一个函数,它将向量设置为字符串,用新名称复制一个swave文档,然后运行该swave。在swave文档中,我想使用我在函数中设置的向量,但它似乎没有看到它

(编辑:我将此函数更改为使用tempdir((),如Dirk所建议的那样)

我创建了一个swave文件test_swave.rnw

% 
\documentclass[a4paper]{article}
\usepackage[OT1]{fontenc}
\usepackage{Sweave}
\begin{document}

\title{Test Sweave Document}
\author{gb02413}

\maketitle

<<>>=
ls()
Sys.time()
print(paste("The chosen study was ",chstud,sep=""))
@ 
\end{document}
然而,如果我调用onOK(),我会得到这个输出

> ls()
[1] "onOK"
而print(…chstud…)函数会生成一个错误

我怀疑这是一个环境问题,但我假设,因为对swave的调用发生在onOK函数中,它将在相同的环境中,并将看到函数中创建的所有对象。如何让Swave进程看到chstud向量

谢谢


保罗。

好吧,我意识到我最初关于“简单、独立的例子”的想法并不特别简单或有用。所以我重述了我的例子,并为自己找到了一种答案,尽管我希望有人能解释原因,甚至提出更好的解决方案, 下面是我的示例test\u swave.Rnw文件

% 
\documentclass[a4paper]{article}
\usepackage[OT1]{fontenc}
\usepackage{Sweave}
\begin{document}

\title{Test Sweave Document}
\author{Paul Hurley}

\maketitle

<<>>=

if(exists("foo")){print(foo)}
ls()
Sys.time()
@ 
\end{document}
如果我运行此代码(即,相同的东西,直接运行)

如果我运行这个代码

testBar<-function(){
    foo<<-"My Test String"
    Sweave("test_sweave.Rnw")
    require(tools) 
    texi2dvi(file = "test_sweave.tex", pdf = TRUE)
}

rm(foo)
testBar()

因此,似乎Swave是在全球环境中运行的,而不是在它被调用的环境中运行的。这意味着当从函数运行swave时,将变量传递给swave的唯一方法是使用I have类似的问题。最终我找到了一个“适合我”的工作,尽管这可能不是解决这个问题的最优雅的方式

在我的函数中,在执行“swave”之前,我放置了一条语句来全局存储本地环境:

temp <<- environment()

temp您能模拟一个完整的、自包含的示例吗?最好是以便携方式(例如使用
tempdir()
tempfile()
)?我已尝试重新编写该函数。如果我完全没有理解使用tempdir()/tempfile()的要点,请告诉我。我仍然不理解您的问题。您认为代码片段和swave文件之间的关系是什么?我看不出有,但可能我缺少咖啡。啊,对了,在我上面的例子中,没有,在我最初的问题中,我想用chstud向量来做一些事情,我会再次更新它……我在R-helplist上问了这个问题,邓肯·默多克给出了一个非常有用的答案。看见
testFoo<-function(){    
  foo<-"My Test String"     
  Sweave("test_sweave.Rnw")     
  require(tools)    
  texi2dvi(file = "test_sweave.tex", pdf = TRUE) 
}

rm(foo) testFoo()
> if (exists("foo")) {
+ print(foo)
+ }
> ls()
[1] "testFoo"
rm(foo)
foo<-"My Test String"
Sweave("test_sweave.Rnw")
require(tools) 
texi2dvi(file = "test_sweave.tex", pdf = TRUE)
> if (exists("foo")) {
+ print(foo)
+ }
[1] "My Test String"
> ls()
[1] "foo" "testFoo"
testBar<-function(){
    foo<<-"My Test String"
    Sweave("test_sweave.Rnw")
    require(tools) 
    texi2dvi(file = "test_sweave.tex", pdf = TRUE)
}

rm(foo)
testBar()
> if (exists("foo")) {
+ print(foo)
+ }
[1] "My Test String"
> ls()
[1] "foo" "testBar" "testFoo"
temp <<- environment()
testFoo<-function(){    
  foo<-"My Test String"
  temp <<- environment()
  Sweave("test_sweave.Rnw")     
  require(tools)    
  texi2dvi(file = "test_sweave.tex", pdf = TRUE) 
}

rm(foo) testFoo()
% 
\documentclass[a4paper]{article}
\usepackage[OT1]{fontenc}
\usepackage{Sweave}
\begin{document}

\title{Test Sweave Document}
\author{Paul Hurley}

\maketitle

<<>>=

if(exists("foo", envir=temp)) { print(temp$foo) }
ls()
Sys.time()
@ 
\end{document}