as.name()不能作为参数

时间:2016-01-12 18:54:15

标签: r rename

我构建了一个函数,其返回值根据其内容命名。使用as.name()在控制台中工作,但不能作为函数参数。

x <- "newNameforIris"
assign(x, iris)
as.name(x)
# [1] newNameforIris
head(newNameforIris) # gives familiar results (not included)
save(as.name(x), file = "nnfi.bin")
# [1] Error in save(as.name(x), file = "nnfi.bin") : object ‘as.name(x)’ not found

我也试过eval.promises = FALSE,但无济于事。在函数执行之前我不知道对象的名称,所以我没有as.name()或其他替代方案。

2 个答案:

答案 0 :(得分:1)

在问了2.5年后,我发现了这个问题,并且由于没有令人满意的答案,我对此问题进行了调查。这是我的发现。

调查:

再现了故障,但问题不只是import numpy as np from skimage import data, img_as_float from skimage.transform import rescale from skimage import exposure class ExposureSuite: def setup(self): self.image = img_as_float(data.moon()) self.image = rescale(self.image, 2.0, anti_aliasing=False) def time_equalize_hist(self): # Running it 10 times to achieve significant performance time. for i in range(10): result = exposure.equalize_hist(self.image)

as.name()

以下成功。

x <- "newNameforIris"
assign(x, iris)
as.name(x)
head(newNameforIris) # as expected
save(as.name(x), file = "nnfi.bin")
# Error in save(as.name(x), file = NULL) : object ‘as.name(x)’ not found
save(as.character(x), file = "nnfi.bin")
# Error in save(as.character(x), file = NULL) : object ‘as.character(x)’ not found
save(eval(as.name(x)), file = "nnfi.bin")
# Error in save(eval(as.name(x)), file = "nnfi.bin") : object ‘eval(as.name(x))’ not found

结论:

y <- as.name(x) save(y, file = "nnfi.bin") save("x", file = "nnfi.bin") save(list=c("x"), file = "nnfi.bin") save(list=c(as.character(as.name(x))), file = "nnfi.bin") 的{​​{1}}参数只能接受符号和字符串,就像帮助文件中所说的:“要保存的对象的名称(作为符号或字符串)”。 / p>

因此,让我们看一下...如何处理save()。只需输入save(),而不是...

save

现在让我们用save()和上面其他失败的测试来进行测试。

save
#....
#     names <- as.character(substitute(list(...)))[-1L]
#     list <- c(list, names)
#....

答案:

as.name(x)的{​​{1}}参数中的项目不进行评估,而是转换为字符串,因此,除非这些字符串与现有对象相同,否则函数调用将失败。

建议:

使用以下内容。

fx <- function(..., list = character()) {
     names <- as.character(substitute(list(...)))[-1L]
     list <- c(list, names)
     return(list)
     }

fx(as.name(x))       # [1] "as.name(x)"
fx(as.character(x))  # [1] "as.character(x)"
fx(eval(as.name(x))) # [1] "eval(as.name(x))"

答案 1 :(得分:0)

这是因为as.name(x)的班级是name

class(as.name(x))
# [1] "name"

尝试:

save(get(x), file = "nnfi.bin")