我构建了一个函数,其返回值根据其内容命名。使用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()
或其他替代方案。
答案 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")