这是我的情况。我有一个data.frame,让我们说:DF <- data.frame(....)
现在我想使用SASxport::write.xport(DF, ...)
函数write.xport采用变量的名称并使用它来命名SAS数据集。因此,上面的代码将生成SAS数据集,其中一个表名为&#34; DF&#34;。 好。至于好。
现在我想在另一个执行一些初始任务的函数中调用SASxport。
fn <- function(DataFrame) {
.... do something ....
write.xport( DataFrame, .... )
}
fn(DF)
现在出现了问题。生成的SAS数据集包含一个名为&#34; DataFrame&#34;的表,而不是&#34; DF&#34;。
所以,我试图获取数据集的原始名称并以某种方式将其传递给write.xport:
fn <- function(DataFrame) {
.... do something ....
params <- as.list(match.call()[-1])
name <- as.character(params$DataFrame)
write.xport( eval(parse(text=name)), .... )
}
fn(DM)
但这不起作用。它会创建具有无效名称的SAS文件(因此它不是&#34; DM&#34;当然),使SAS无法读取该文件。 eval / substitute也不起作用(SAS中的名称是&#34; eval_sub&#34;)。
如何将数据集的原始名称DF传递给write.xport的内部调用?
代码应该欺骗write.xport函数,给她DF,而不是DataFrame,就像手动在控制台中编写代码一样。
这可能吗?
编辑:
好的,eval(parse(text = paste0("write.xport(", name, .........")))
做了伎俩。它现在解决了。
答案 0 :(得分:2)
我建议你尝试避免eval()
这样的情况。最好的方法是使用list=
函数的write.xport
参数。使用setNames()
,您可以为对象设置所需的名称。在这里,我还添加了一个名为name=
的参数,您可以在其中设置所需的任何名称,但它将默认为传递给函数的变量的名称。
#test data
DF<-data.frame(a=1:10, b=letters[1:10])
library(SASxport)
fn <- function(DataFrame, name=deparse(substitute(DataFrame))) {
write.xport( list=setNames(list(DataFrame), name), file="test.dat")
}
fn(DF)
答案 1 :(得分:0)
好的,eval(parse(text = paste0("write.xport(", name, .........")))
做了伎俩。 SAS文件生成正确,并包含一个名为required的表。它现在解决了。