我正在尝试在R中编写一个非常基本的IF语句并且卡住了。我以为我找到了同样问题的人,但我不能。对不起,如果以前已经解决了这个问题。
我想检查是否已分配变量/对象,如果是,我想执行属于R包的函数。首先我写了
FileAssignment <- function(x){
if(exists("x")==TRUE){
print("yes!")
x <- parse.vdjtools(x)
} else { print("Nope!")}
}
我将文件名指定为x
FILENAME <- "FILENAME.txt"
我运行功能
FileAssignment(FILENAME)
我使用print(&#34; yes!&#34;)并打印(&#34; Nope!&#34;)来检查IF-Statement是否有效,确实如此。但是,未分配parse.vdjtools(x)
部分。现在我在函数之外测试了相同的IF语句:
if(exists("FILENAME1")==TRUE){
FILENAME1 <- parse.vdjtools(FILENAME1)
}
这很有效。我读到here可能是因为函数使用了{}
而if语句也是如此。所以我应该从if语句中删除括号。
FileAssignment <- function(x){
if(exists("x")==TRUE)
x <- parse.vdjtools(x)
else { print("Nope!")
}
也没用。
我认为它可能与特定的parse.vdjtools(x)
函数有关,所以我只是尝试使用x <- 20
为x分配一个正常值。也没有在函数内部工作,但是,它在外面。
答案 0 :(得分:3)
我真的不知道你想要实现什么,但是我知道在这种情况下使用exists
是错误的。 x无法在函数内部存在。见这个例子
# All this does is report if x exists
f <- function(x){
if(exists("x"))
cat("Found x!", fill = TRUE)
}
f()
f("a")
f(iris)
# All will be found!
调查file.exists
而不是?这是矢量化的,因此可以同时调查文件向量。
答案 1 :(得分:1)
你提出的问题不像你想象的那么简单。为了获得理想的行为,有两点需要解决,特别是第一点有些棘手:
正如@NJBurgo和@KonradRudolph所指出的,变量x
将始终存在于函数中,因为它是函数的参数。因此,在您的情况下,函数exists()
不应检查变量x
是否已定义。相反,它应该用于验证是否存在x
中存储的与字符串对应的名称的变量。
这是通过使用deparse()
和substitute()
的组合来实现的
if (exists(deparse(substitute(x)))) { …
:
x
由于<<-
仅在函数范围内定义,因此超级对齐运算符x
需要在函数外部显示分配给x
的值,如由@thothai建议。但是,功能不应该有这样的副作用。这种编程的问题包括可能与另一个名为FileAssignment <- function(x){
if (exists(deparse(substitute(x)))) {
print("yes!")
return(parse.vdjtools(x))
} else {
print("Nope!")
return(NULL)}
}
的变量发生冲突,该变量可以在函数体外部的不同上下文中定义,以及关于函数执行的操作缺乏明确性。
更好的方法是返回值,而不是将其分配给变量。
结合这两个方面,可以像这样重写函数:
x
在此版本的函数中,FileAssignment(a)
的范围仅限于函数体,函数没有副作用。 parse.vdjtools(a)
的返回值为NULL
或a
,具体取决于x
是否存在。
在函数外部,可以使用
x <- FileAssignment(a)
window.currentIndex=0;