Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:lappy函数-跳过当前函数循环_R_Function_Lapply - Fatal编程技术网

R:lappy函数-跳过当前函数循环

R:lappy函数-跳过当前函数循环,r,function,lapply,R,Function,Lapply,我在多个文件的列表上使用lappy函数。有没有一种方法可以跳过当前文件上的函数而不返回任何内容,直接跳到文件列表中的下一个文件 确切地说,我有一个if语句来检查条件,如果该语句返回FALSE,我想跳到下一个文件 您可以定义一个自定义函数,用于调用lappy()。下面是一些示例代码,它在文件列表上迭代,并且仅当文件名不包含数字3时才处理文件(有点做作,但希望这能说明问题): 文件lappy将始终返回与所提供的X长度相同的列表。您可以简单地将项目设置为稍后可以过滤掉的内容 例如,如果您有函数pars

我在多个文件的列表上使用lappy函数。有没有一种方法可以跳过当前文件上的函数而不返回任何内容,直接跳到文件列表中的下一个文件


确切地说,我有一个if语句来检查条件,如果该语句返回FALSE,我想跳到下一个文件

您可以定义一个自定义函数,用于调用
lappy()
。下面是一些示例代码,它在文件列表上迭代,并且仅当文件名不包含数字3时才处理文件(有点做作,但希望这能说明问题):


文件
lappy
将始终返回与所提供的
X
长度相同的列表。您可以简单地将项目设置为稍后可以过滤掉的内容

例如,如果您有函数
parsefile

parsefile <-function(x) {
  if(x>=0) {
    x
  } else {
    NULL
  }
}
然后,您将在列表中填写答案和
NULL
s

您可以通过执行以下操作将
NULL
s子集化:

result[!vapply(result, is.null, logical(1))]

正如其他人已经回答的那样,我认为如果不使用
*apply
函数族返回一些内容,就无法继续下一次迭代

在这种情况下,我使用Dean MacGregor的方法,只是做了一个小改动:我使用
NA
而不是
NULL
,这使得过滤结果更容易

files <- list("file1.txt", "file2.txt", "file3.txt")

parse_file <- function(file) {
  if(file.exists(file)) {
    readLines(file)
  } else {
    NA
  }
}

results <- lapply(files, parse_file)
results <- results[!is.na(results)]

您可以使用该条件选择列表的子集,并将该子集存储在一个单独的变量中,您可以将该变量提供给
lappy
@RHertel,因为他们正在处理文件列表,而不是已经存在于RAM中的数据。他们不太可能提前获得文件子集的信息。最后一位可以改进:
list.condition我还将
parsefiles
重命名为
parsefile
,因为它一次只需要一个文件,但这太挑剔了@sdgfsdh只是为了你我做到了
result[!vapply(result, is.null, logical(1))]
files <- list("file1.txt", "file2.txt", "file3.txt")

parse_file <- function(file) {
  if(file.exists(file)) {
    readLines(file)
  } else {
    NA
  }
}

results <- lapply(files, parse_file)
results <- results[!is.na(results)]
res_na   <- list("a",   NA, "c")
res_null <- list("a", NULL, "c")
microbenchmark::microbenchmark(
  na = res_na[!is.na(res_na)],
  null = res_null[!vapply(res_null, is.null, logical(1))]
)
Unit: nanoseconds
expr  min   lq    mean median   uq   max neval
  na    0    1  410.78    446  447  5355   100
null 3123 3570 5283.72   3570 4017 75861   100