2015-06-12 2 views
0

В следующем упрощенном примере , когда я запрашиваю значение переменной «var», написав «var» . Я ничего не получаю. Я должен использовать функцию печати , чтобы это работало. Может кто-нибудь объяснить это поведение мне, пожалуйста. Заранее благодарю вас всех.поведение «печать» внутри функции

Foo <- function(){ 
    var <- 1 
    var   # it does nothing 
    print(var) # 1 
} 

Foo() 

На руке он работает нормально, если мы просто написать, из любой функции:

var <- 2 
var  # 2 
print(var) # 2 
+0

Да, вам нужно либо «распечатать», либо «cat», чтобы вернуть «var», как вы ясно показали. –

+0

Я думаю, что вы правы. Там я вижу комментарий «Это один из тех причуд в R». Я подожду немного, а потом уберу вопрос. Большое спасибо Паскалю. –

+1

@Pascal, две темы определенно связаны, но на самом деле не то же самое, поэтому я думаю, что этот вопрос действительно. Проблема в другом вопросе заключается в том, почему присваивания не дают возвращаемых значений, тогда как этот вопрос касается того, почему утверждения не печатаются. Возможно, ответы на другие вопросы удовлетворяли ОП, но я не думаю, что есть какой-то вред, если оставить это тоже открытым. – Backlin

ответ

0

Я считаю, что ответ в том, что R не печатает исход заявлений, происходящих внутри функции просто потому что это может привести к большому количеству беспорядков при запуске кода других людей.

Вы можете сделать такие вещи, как

f <- function(x){ 
    na.fail(x) 
    rowMeans(x) 
} 

где na.fail является функцией, которая останавливает выполнение, если x содержит недостающие значения и возвращает x, если нет. Распечатка x, скорее всего, не то, что автор намеревался или чего хочет пользователь, поэтому разработчики R, вероятно, считали, что лучше потребовать от автора функции явно указать, что должно быть напечатано.

Можно, конечно, утверждать, что в приведенном выше примере это просто бедные кодирования и что вы должны сделать это вместо:

f <- function(x) rowMeans(na.fail(x)) 

Тем не менее, поведение по умолчанию R, вероятно, является наиболее оборонительным решением.

Однако, если функция возвращает значение в последней строке

Foo <- function(){ 
    var <- 1 

    print("var") 
    var   # it doesn't show var 

    print("print(var)") 
    var   # It shows var 
} 

это получить распечатаны при оценке на верхнем уровне R сессии (даже без печати!), То есть, если она была вызвана явно пользователем

Foo() 
[1] "var" 
[1] "print(var)" 
[1] 1 

Это потому, что Foo() является собственным заявлением, возвращая значение, которое печатается, если оно существует на верхнем уровне. Если это происходит внутри функции, оно не печатается.

f <- function(x){ 
    Foo() 
    rowMeans(x) 
} 

За исключением случаев, когда оно возвращается к верху.

+0

Вы правы, когда говорите о решении разработчиков. В любом случае, давайте рассмотрим, что ответ лежит на предложении Паскаля как дубликат. –