R:如何通过保留原始名称的两个函数传递变量?

时间:2015-04-03 15:15:54

标签: r

这是我的情况。我有一个data.frame,让我们说:DF <- data.frame(....)

现在我想使用SASxport::write.xport(DF, ...)

将此DF导出到SAS传输文件

函数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, .........")))做了伎俩。它现在解决了。

2 个答案:

答案 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的表。它现在解决了。