4

スクリプトの最後のステートメントとして関数呼び出しを含む R スクリプトで個々の関数をテストしようとしています。つまり、R コードは次のとおりです。

mul.R
#!/usr/bin/env Rscript

mul <- function(n, m) {
        prod <- n * m
        return (prod)
}


mul(4,5)

テストスクリプトは次のとおりです。

test_simpleProgram.R
#!/usr/bin/env Rscript

library('RUnit')
source("./../simpleProgram.R")

test.mul <- function() {
        checkEqualsNumeric(mul(n= 2,m= 3), 4)
}

次のコマンドを使用してテスト スクリプトを実行します。

runTestFile(absFileName= file.path("test_simpleProgram.R"))

ここで、テストしたいRスクリプトをソースすると、つまりmul.R、最後のステートメントがすでにmul関数を呼び出しているため、スクリプト全体が実行され、テストスクリプトが関数を再度実行します。これにより、最初の実行 ( によるsource(..)) がテスト目的で不要になります。

テストスクリプトでスクリプトをソースするときにスクリプトを実行せずに、そのようなスクリプトをテストする方法はありますか?

4

1 に答える 1

4

parseの代わりに使用source:

code <- parse("c:/R/mul.R") # actual file path may vary

これにより、ファイルが未評価の式としてロードされます。それは次のように見ることができます:

# > as.list(code)
# [[1]]
# mul <- function(n, m) {
#     prod <- n * m
#     return(prod)
# }
# 
# [[2]]
# mul(4, 5)

上記のリストの最初の要素は、実際には'<-'関数の呼び出しです。

# > as.list(code[[1]])
# [[1]]
# `<-`
# 
# [[2]]
# mul
# 
# [[3]]
# function(n, m) {
#     prod <- n * m
#     return(prod)
# }

2 番目の要素 OTOH は、mul関数の呼び出しです。

# > as.list(code[[2]])
# [[1]]
# mul
# 
# [[2]]
# [1] 4
# 
# [[3]]
# [1] 5

そのため、ファイルが割り当てと望ましくない関数呼び出しで構成されている場合、上記のリストの各エントリの最初の要素を調べることで識別できます。

filter <- sapply(code, function(x)as.character(x[[1]])=="<-")

# >filter
# [1] TRUE FALSE

これで、割り当てのみを評価できます。

eval(code[filter], envir=globalenv())

次に、関数を呼び出すことができますtest.mul。これらのステートメントを使用して、呼び出しを置き換えることができsourceます。

これは、他のフィルターに一般化できます。たとえば、最後のステートメントを除くすべてのステートメントを評価する場合は、次のように使用できます。

eval(code[-length(code)], envir=globalenv())
于 2013-03-27T04:51:35.350 に答える